簡體   English   中英

MVVM - 如何跨多個 ViewModel 共享單個存儲庫 class

[英]MVVM - How to share a single repository class across multiple ViewModels

我有多個訪問單個存儲庫的視圖模型(一個活動和 rest 片段)。

AdminActivityViewModel

AdminListUsersViewModel

AdminUserTransactionsViewModel

......還有更多

我的AdminRepo class 有多個構造函數,因此我可以從 ViewModel 傳遞回調方法

 public AdminRepo(Application application, AdminActivityCallback callback) {
        this.callback = callback;
        BaseApplication baseApplication = (BaseApplication) application;
        RetrofitClient client = baseApplication.getRetrofitClient();
        adminService = client.getRetrofit().create(AdminService.class);

        SharedPrefManager sharedPref = SharedPrefManager.getInstance(application);
        AuthHeader authHeader = new AuthHeader(
                sharedPref.getIdToken(),
                sharedPref.getIdClient(),
                sharedPref.getUserEmail()
        );
        client.setAuthHeader(authHeader);
    }
 public AdminRepo(Application application, AdminListUsersCallback callback) {
        //Exact same code in constructor as above ^
 }
 public AdminRepo(Application application, AdminUserTransactionsCallback callback) {
        //Exact same code in constructor as above ^
 }

在每個ViewModels中,我都在創建一個AdminRepo實例(這可能是一個不好的做法),但我不知道如何改進它。

public class AdminActivityViewModel extends AndroidViewModel implements AdminActivityCallback

   public AdminActivityViewModel(@NonNull Application application) {
        super(application);
        repo = new AdminRepo(application, this);
}

如何設計我的AdminRepo和 ViewModel 以便它們共享一個存儲庫,而無需每次都創建昂貴的AdminRepo class?

I have considered making my AdminRepo class a singleton with a .getInstance() method, but I'm getting SO MANY contradicting posts on how Repository classes SHOULD NOT be static or a singleton, which makes me extremely confused on what I SHOULD do.

https://stackoverflow.com/a/7464235/11110509

如果所有視圖模型同時存在並且存儲庫不保留任何 state,您可以共享相同的存儲庫實例並為每個視圖 model 提供該實例。 然而這里沒有魔法的地方——如果你創建一個存儲庫的實例,你必須保留對它的引用,所以你可以將相同的 object 傳遞給其他視圖模型。

首先,您需要讓您的視圖 model 接受外部依賴項(我建議查看依賴項注入模式)

YourViewModel( /* other dependencies ..., */ AdminRepo adminRepo) 

一旦你有了它,你需要創建一個視圖 model 工廠。 這篇文章很好地描述了它,但長話短說:實現ViewModelProvider.Factory它將保留您的存儲庫實例並在ViewModelProvider中使用它來獲取您的視圖 model 的實例。

通過此設置,您將可以控制創建的實例以及創建其他視圖模型的方式。 這可以通過使用依賴注入框架(Koin、dagger、hilt)實現自動化。 如果您使用 Dagger 或Hilt (由 Google 推薦),那么您可以通過提供適當的注釋將您的 object 生命周期留在框架手中。 讓我們試試這個例子:

@Singleton
class MyRepository { ...

@HiltViewModel
class MyViewModel {
   MyRepository repo;
   @Inject MyViewModel(MyRepository repo) { ...
   ...

此代碼將使您的存儲庫成為與您的應用程序生命周期相關的 singleton。 通常你不想這樣做,因為 object 將存在於 memory 中,即使你移動到不需要它的屏幕。 但是您可以使用@ActivityScoped ,這樣您的存儲庫就可以在活動中存活。

現在,如果這些視圖模型具有不同的生命周期並且它們不重疊,那么為它們中的每一個創建一個新實例就完全沒問題了。 當您不再需要它們時,您不想在 memory 中保留不必要的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM