[英]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.
如果所有視圖模型同時存在並且存儲庫不保留任何 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.