前言
我們都知道在Activity之間傳遞資料很繁瑣,為了簡化,很多人都是使用過EventBus,可EventBus在追蹤問題時反而束手無策,反而增加調試時間,那我們能不能找一個折中的方案,又能簡單的實作,又能容易追查問題呢?
下面請允許我介紹一下最新的方式在實作資料的Result一、先來看看以前我們都是如何做的
override
以前,我們都是這樣處理Result,分别定義不同的RequestCode,然後根據這個值來比對資料。我們再來看看新的方式,然後做個比較
二、Activity Result新方式
step one: 加入依賴
implementation
step two: 編碼
class
繼承ActivityResultContract,并覆寫createIntent和parseResult函數,這倆函數很好了解,一個負責建立Intent,一個負責解析Result,
那接下來如何使用呢?class
隻需要調用registerForActivityResult函數,然後在點選事件中,用其傳回值調用launch函數即可
class
代碼運作效果 這麼實作有什麼優點呢? - 一方面針對ResultActivity的啟動傳參數,更加的具體,啟動該Activity,不必要關心postId的key是什麼,這樣在其他頁面需要調用的時候,也隻是傳入參數,這樣對于以後key的重構就不會影響其他部分
- 另一方面不再需要定義RequestCode,也不錯哦
- 其實它還有個優勢哦,看過源碼才知道,其實它是結合了lifecycle,在頁面銷毀的時候,會自動将生成的RequestCode給remove掉
Fragment Result新方式
一張圖看清整個通訊的過程Fragment B 使用 FragmentManager 将資料發送到 Fragment A
在生成結果的 Fragment B 中,必須使用相同的 requestKey 在同一 FragmentManager 上設定結果。您可以使用 setFragmentResult() API 來完成此操作:
button
在Fragment A中注冊回調結果監聽
FragmentManager
這種情況需要注意的就是requestKey,在出去和傳回的時候都要保持一緻。還有一種情況是,如果有多個資料傳遞,隻會接收到最新的值,更Activity一樣,在DESTROYED時,會自動取消listener,
以上是同級Fragment的傳遞,如果是父子級呢?如圖所示,需要在Parent Fragment 調用 childFragmentManager來注冊listener
override
這麼實作有什麼優點呢? - 完全解耦,無需依賴對方
- 當ON_DESTROY時自動登出
文章和往期幹貨已被收錄至專欄【 進擊的Android秃頭 】, 喜歡 的或者 覺得我寫的還行 的朋友 可以點一波雙關(關注作者+關注專欄)喲。作者: @程式寫到秃 專欄:
“下方卡片”【
進擊的Android秃頭】
進擊的Android秃頭zhuanlan.zhihu.com