如何在Android中使用Dagger2将字符串传递给ViewModel/Repository类?
这是我的片段类:如何在Android中使用Dagger2将字符串传递给ViewModel/Repository类?,android,dependency-injection,dagger-2,dagger,Android,Dependency Injection,Dagger 2,Dagger,这是我的片段类: public class MyFragment extends DaggerFragment { @Inject MyViewModelFactory factory; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) { String uid = "123"; //H
public class MyFragment extends DaggerFragment {
@Inject MyViewModelFactory factory;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
String uid = "123"; //How to pass this String??
MyViewModel viewModel = ViewModelProviders.of(this, factory).get(MyViewModel.class);
LiveData<User> liveData = viewModel.getUserLiveData();
}
}
这个MyRepository
类:
public class MyViewModel extends ViewModel {
private MutableLiveData<User> liveData;
@Inject
MyViewModel(MyRepository repository) {
userLiveData = repository.addUserToLiveData();
//Here I need the value of that String "123"
}
LiveData<User> getUserLiveData() {
return liveData;
}
}
@Singleton
class MyRepository {
private Retrofit retrofit;
@Inject
MyRepository(Retrofit retrofit) {
//Or here I need the value of that String "123"
}
MutableLiveData<User> addUserToLiveData() {
//Make api call using retrofit
}
}
@Module
public class AppModule {
@Singleton
@Provides
static Retrofit provideRetrofit(){
return new Retrofit.Builder()... //Initialize retrofit
}
}
@Module
abstract class MyViewModelModule {
@Binds
abstract ViewModelProvider.Factory bindMyViewModelFactory(MyViewModelFactory factory);
@Binds
@IntoMap
@ViewModelKey(MyViewModel.class)
abstract ViewModel provideMyViewModel(MyViewModel viewModel);
}
在MyViewModelModule
class中:
public class MyViewModel extends ViewModel {
private MutableLiveData<User> liveData;
@Inject
MyViewModel(MyRepository repository) {
userLiveData = repository.addUserToLiveData();
//Here I need the value of that String "123"
}
LiveData<User> getUserLiveData() {
return liveData;
}
}
@Singleton
class MyRepository {
private Retrofit retrofit;
@Inject
MyRepository(Retrofit retrofit) {
//Or here I need the value of that String "123"
}
MutableLiveData<User> addUserToLiveData() {
//Make api call using retrofit
}
}
@Module
public class AppModule {
@Singleton
@Provides
static Retrofit provideRetrofit(){
return new Retrofit.Builder()... //Initialize retrofit
}
}
@Module
abstract class MyViewModelModule {
@Binds
abstract ViewModelProvider.Factory bindMyViewModelFactory(MyViewModelFactory factory);
@Binds
@IntoMap
@ViewModelKey(MyViewModel.class)
abstract ViewModel provideMyViewModel(MyViewModel viewModel);
}
我尝试的是在ViewModel/repository构造函数中添加字符串,但没有成功。请帮助我将该
uid
传递给ViewModel或repository类。谢谢 一种可能的解决方案是每个viewmodel有一个工厂,然后将UID设置为工厂,工厂将其传递给viewmodel
class MyViewModelFactory @Inject constructor(
private val repository: Repository
): ViewModelProvider.Factory {
lateinit var uid: String
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T =
if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
MyViewModel(
repository,
uid
) as T
} else {
throw IllegalArgumentException("Unknown ViewModel class [$modelClass]")
}
}
类MyViewModelFactory@Inject构造函数(
专用val存储库:存储库
):ViewModelProvider.Factory{
lateinit变量uid:字符串
@抑制(“未选中的_CAST”)
重写趣味创建(modelClass:Class):T=
if(modelClass.isAssignableFrom(MyViewModel::class.java)){
MyViewModel(
存储库,
液体
)as T
}否则{
抛出IllegalArgumentException(“未知的ViewModel类[$modelClass]”)
}
}
然后
@Nullable
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、捆绑包){
String uid=“123”//如何传递此字符串??
setUid(uid);
MyViewModel viewModel=ViewModelProviders.of(this,factory).get(MyViewModel.class);
LiveData LiveData=viewModel.getUserLiveData();
}
编辑:在Java中
public final class MyViewModelFactory implements Factory {
private final Repository repository;
private String uid;
@Inject
public MyViewModelFactory(Repository repository) {
this.repository = repository;
}
@NotNull
public ViewModel create(@NotNull Class modelClass) {
if (modelClass.isAssignableFrom(MyViewModel.class)) {
return new MyViewModel(repository, uid);
} else {
throw (Throwable)(new IllegalArgumentException("Unknown ViewModel class [" + modelClass + ']'));
}
}
public void setUid(@NonNull final String uid) {
this.uid = uid;
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
String uid = "123"; //How to pass this String??
factory.setUid(uid);
MyViewModel viewModel = ViewModelProviders.of(this, factory).get(MyViewModel.class);
LiveData<User> liveData = viewModel.getUserLiveData();
}
公共最终类MyViewModelFactory实现工厂{
私有最终存储库;
私有字符串uid;
@注入
公共MyViewModelFactory(存储库){
this.repository=存储库;
}
@NotNull
公共视图模型创建(@NotNull类modelClass){
if(modelClass.isAssignableFrom(MyViewModel.class)){
返回新的MyViewModel(存储库,uid);
}否则{
throw(Throwable)(新的IllegalArgumentException(“未知的ViewModel类[“+modelClass+”]);
}
}
public void setUid(@NonNull final String uid){
this.uid=uid;
}
}
@可空
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、捆绑包){
String uid=“123”//如何传递此字符串??
setUid(uid);
MyViewModel viewModel=ViewModelProviders.of(this,factory).get(MyViewModel.class);
LiveData LiveData=viewModel.getUserLiveData();
}
一种可能的解决方案是每个viewmodel有一个工厂,然后将UID设置为工厂,工厂将其传递给viewmodel
class MyViewModelFactory @Inject constructor(
private val repository: Repository
): ViewModelProvider.Factory {
lateinit var uid: String
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T =
if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
MyViewModel(
repository,
uid
) as T
} else {
throw IllegalArgumentException("Unknown ViewModel class [$modelClass]")
}
}
类MyViewModelFactory@Inject构造函数(
专用val存储库:存储库
):ViewModelProvider.Factory{
lateinit变量uid:字符串
@抑制(“未选中的_CAST”)
重写趣味创建(modelClass:Class):T=
if(modelClass.isAssignableFrom(MyViewModel::class.java)){
MyViewModel(
存储库,
液体
)as T
}否则{
抛出IllegalArgumentException(“未知的ViewModel类[$modelClass]”)
}
}
然后
@Nullable
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、捆绑包){
String uid=“123”//如何传递此字符串??
setUid(uid);
MyViewModel viewModel=ViewModelProviders.of(this,factory).get(MyViewModel.class);
LiveData LiveData=viewModel.getUserLiveData();
}
编辑:在Java中
public final class MyViewModelFactory implements Factory {
private final Repository repository;
private String uid;
@Inject
public MyViewModelFactory(Repository repository) {
this.repository = repository;
}
@NotNull
public ViewModel create(@NotNull Class modelClass) {
if (modelClass.isAssignableFrom(MyViewModel.class)) {
return new MyViewModel(repository, uid);
} else {
throw (Throwable)(new IllegalArgumentException("Unknown ViewModel class [" + modelClass + ']'));
}
}
public void setUid(@NonNull final String uid) {
this.uid = uid;
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
String uid = "123"; //How to pass this String??
factory.setUid(uid);
MyViewModel viewModel = ViewModelProviders.of(this, factory).get(MyViewModel.class);
LiveData<User> liveData = viewModel.getUserLiveData();
}
公共最终类MyViewModelFactory实现工厂{
私有最终存储库;
私有字符串uid;
@注入
公共MyViewModelFactory(存储库){
this.repository=存储库;
}
@NotNull
公共视图模型创建(@NotNull类modelClass){
if(modelClass.isAssignableFrom(MyViewModel.class)){
返回新的MyViewModel(存储库,uid);
}否则{
throw(Throwable)(新的IllegalArgumentException(“未知的ViewModel类[“+modelClass+”]);
}
}
public void setUid(@NonNull final String uid){
this.uid=uid;
}
}
@可空
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、捆绑包){
String uid=“123”//如何传递此字符串??
setUid(uid);
MyViewModel viewModel=ViewModelProviders.of(this,factory).get(MyViewModel.class);
LiveData LiveData=viewModel.getUserLiveData();
}
好的,让我检查一下,然后再打给你。这让我很难理解,因为它在科特林,我对它不太熟悉:|做不好。哦,非常感谢你。现在好多了。我现在就试试看,然后再给你打电话。好吧,让我检查一下,然后再给你打电话。这让我很难理解,因为它在科特林,而且我对它不太熟悉:|做不好。哦,非常感谢你。现在好多了。我现在就去试试,然后再打给你。