如何使用在 activity 中获得的值注入对象?
How to inject an object using a value obtained in an activity?
我有一个 activity,我从 Firebase 身份验证中获得用户的 uid
:
public class MainActivity extends DaggerAppCompatActivity {
@Inject UserViewModel userViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
userViewModel.setUid(uid);
}
}
我在我的视图模型中使用这个 uid
class:
public class UserViewModel extends ViewModel {
private CollectionReference usersRef;
@Inject
UsersViewModel(CollectionReference usersRef) {
this.usersRef = usersRef;
}
void setUid(String uid) {
DocumentReference uidRef = usersRef.document(uid);
//Use uidRef
}
}
这是我的应用程序模块 class:
class AppModule {
@Singleton
@Provides
static FirebaseFirestore provideFirebaseFirestoreInstance() {
return FirebaseFirestore.getInstance();
}
@Singleton
@Provides
static CollectionReference provideUsersCollectionRef(FirebaseFirestore db) {
return db.collection("users");
}
@Singleton
@Provides
static DocumentReference provideUidDocumentRef(CollectionReference usersRef) {
return usersRef.document(uid); //How to add the uid here
}
}
问题是,如何在应用程序模块 class 中添加 uid
,这样我就可以像这样在视图模型 class 中直接注入 DocumentReference:
public class UserViewModel extends ViewModel {
private DocumentReference uidRef;
@Inject
UserViewModel(DocumentReference uidRef) {
this.uidRef= uidRef;
//Use uidRef
}
}
您尝试注入依赖项的心态是正确的,但不幸的是,并非所有依赖项都可以通过 constructor injection
提供,其中一些需要一些仅在运行时才知道的信息。
看看你的代码,UserViewModel
被注入了 MainActivity
,它的一些依赖是通过构造函数注入提供的,但你必须通过 [=17] 提供它的 uid
依赖=] 在 userViewModel.setUid(uid);
行中,一旦在运行时检索到 uid。
一旦 uid 已知,您的代码就可以从列表中检索 DocumentReference
。也许更改 MainActivity 中的代码以检索 DocumentReference 并通过 setter 将其提供给 UserViewModel?
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
userViewModel.setDocumentReference(db.collection("users").document(uid));
如果你真的想像你描述的那样直接在你的视图模型中注入 DocumentReference class,你可以将 uid 作为构造函数参数添加到你的 AppModule。
但是假设您的 AppModule 由在您的应用程序 class 中创建的 AppComponent 使用,您将没有应用程序 class 中的 uid 来创建 AppModule。
因此您必须为您的 UserViewModel class 创建另一个组件,例如 UserComponent。并创建一个 UserModule,它在构造函数中接收 uid 作为参数。
然后在您的 MainActivity 中,一旦您检索到 uid,您就创建了 UserComponent:
UserComponent userComponent = DaggerUserComponent.builder().userModule(new UserModule(uid)).build();
userViewModel.setUserComponent(userComponent);
这就是您的 UserViewModel 的样子:
public class UserViewModel extends ViewModel {
@Inject
private DocumentReference uidRef;
public void setUserComponent(UserComponent userComponent) {
userComponent.inject(this);
}
}
我有一个 activity,我从 Firebase 身份验证中获得用户的 uid
:
public class MainActivity extends DaggerAppCompatActivity {
@Inject UserViewModel userViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
userViewModel.setUid(uid);
}
}
我在我的视图模型中使用这个 uid
class:
public class UserViewModel extends ViewModel {
private CollectionReference usersRef;
@Inject
UsersViewModel(CollectionReference usersRef) {
this.usersRef = usersRef;
}
void setUid(String uid) {
DocumentReference uidRef = usersRef.document(uid);
//Use uidRef
}
}
这是我的应用程序模块 class:
class AppModule {
@Singleton
@Provides
static FirebaseFirestore provideFirebaseFirestoreInstance() {
return FirebaseFirestore.getInstance();
}
@Singleton
@Provides
static CollectionReference provideUsersCollectionRef(FirebaseFirestore db) {
return db.collection("users");
}
@Singleton
@Provides
static DocumentReference provideUidDocumentRef(CollectionReference usersRef) {
return usersRef.document(uid); //How to add the uid here
}
}
问题是,如何在应用程序模块 class 中添加 uid
,这样我就可以像这样在视图模型 class 中直接注入 DocumentReference:
public class UserViewModel extends ViewModel {
private DocumentReference uidRef;
@Inject
UserViewModel(DocumentReference uidRef) {
this.uidRef= uidRef;
//Use uidRef
}
}
您尝试注入依赖项的心态是正确的,但不幸的是,并非所有依赖项都可以通过 constructor injection
提供,其中一些需要一些仅在运行时才知道的信息。
看看你的代码,UserViewModel
被注入了 MainActivity
,它的一些依赖是通过构造函数注入提供的,但你必须通过 [=17] 提供它的 uid
依赖=] 在 userViewModel.setUid(uid);
行中,一旦在运行时检索到 uid。
一旦 uid 已知,您的代码就可以从列表中检索 DocumentReference
。也许更改 MainActivity 中的代码以检索 DocumentReference 并通过 setter 将其提供给 UserViewModel?
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
userViewModel.setDocumentReference(db.collection("users").document(uid));
如果你真的想像你描述的那样直接在你的视图模型中注入 DocumentReference class,你可以将 uid 作为构造函数参数添加到你的 AppModule。
但是假设您的 AppModule 由在您的应用程序 class 中创建的 AppComponent 使用,您将没有应用程序 class 中的 uid 来创建 AppModule。
因此您必须为您的 UserViewModel class 创建另一个组件,例如 UserComponent。并创建一个 UserModule,它在构造函数中接收 uid 作为参数。
然后在您的 MainActivity 中,一旦您检索到 uid,您就创建了 UserComponent:
UserComponent userComponent = DaggerUserComponent.builder().userModule(new UserModule(uid)).build();
userViewModel.setUserComponent(userComponent);
这就是您的 UserViewModel 的样子:
public class UserViewModel extends ViewModel {
@Inject
private DocumentReference uidRef;
public void setUserComponent(UserComponent userComponent) {
userComponent.inject(this);
}
}