提问人:geontricks developer 提问时间:11/9/2023 更新时间:11/9/2023 访问量:40
在 jetpack compose 中将 viewmodel 注入到 hilt 依赖项注入中的小部件
Inject viewmodel to widget in hilt dependency injection in jetpack compose
问:
我使用刀柄依赖注入创建了一个喷气背包组合应用程序。我使用glance创建了一个小部件,它成功运行。现在我想为它创建一个视图模型,并使用相同的机制或不同的机制进行注入。我以不同的方式进行了测试。但我没有得到解决方案。
我使用 jetpack compose 导航来浏览视图,并且我只对主应用程序使用了一个活动。
这是我与glance小部件相关的代码。如果您想了解更多详细信息,请发表评论。我分享了相关数据。
class CustomGlanceWidgetReceiver : GlanceAppWidgetReceiver() {
override val glanceAppWidget: GlanceAppWidget = MyAppWidget()
}
//@AndroidEntryPoint
class MyAppWidget : GlanceAppWidget(){
override suspend fun provideGlance(context: Context, id: GlanceId) {
provideContent {
MyContent()
}
}
}
@Composable
private fun MyContent(
//viewModel: BaseEntryWidgetViewModel = hiltViewModel()
) {
Column(
modifier = GlanceModifier.fillMaxSize(),
verticalAlignment = Alignment.Top,
horizontalAlignment = Alignment.CenterHorizontally
) {
Row(horizontalAlignment = Alignment.CenterHorizontally) {
TextField(value = "", onValueChange = {}, label = {
Text(text = "Title")
})
TextField(value = "", onValueChange = {}, label = {
Text(text = "Amount")
})
Button(
text = "Save",
onClick = { }
)
Button(
text = "Work",
onClick = {}
)
}
}
}
@HiltViewModel
class BaseEntryWidgetViewModel @Inject constructor(
private val wallletRepositoryService: WalletRepositoryService
):ViewModel(){
//
}
我使用刀柄依赖注入创建了一个喷气背包组合应用程序。我使用glance创建了一个小部件,它成功运行。现在我想为它创建一个视图模型,并使用相同的机制或不同的机制进行注入。我以不同的方式进行了测试。但我没有得到解决方案。
我使用 jetpack compose 导航来浏览视图,并且我只对主应用程序使用了一个活动。
这是我与glance小部件相关的代码。如果您想了解更多详细信息,请发表评论。我分享了相关数据。
class CustomGlanceWidgetReceiver : GlanceAppWidgetReceiver() {
override val glanceAppWidget: GlanceAppWidget = MyAppWidget()
}
//@AndroidEntryPoint
class MyAppWidget : GlanceAppWidget(){
override suspend fun provideGlance(context: Context, id: GlanceId) {
provideContent {
MyContent()
}
}
}
@Composable
private fun MyContent(
//viewModel: BaseEntryWidgetViewModel = hiltViewModel()
) {
Column(
modifier = GlanceModifier.fillMaxSize(),
verticalAlignment = Alignment.Top,
horizontalAlignment = Alignment.CenterHorizontally
) {
Row(horizontalAlignment = Alignment.CenterHorizontally) {
TextField(value = "", onValueChange = {}, label = {
Text(text = "Title")
})
TextField(value = "", onValueChange = {}, label = {
Text(text = "Amount")
})
Button(
text = "Save",
onClick = { }
)
Button(
text = "Work",
onClick = {}
)
}
}
}
@HiltViewModel
class BaseEntryWidgetViewModel @Inject constructor(
private val wallletRepositoryService: WalletRepositoryService
):ViewModel(){
//
}
答:
0赞
Trek Ama
11/9/2023
#1
取消注释@AndoridEntryPoint并添加以下内容:
您可以在该函数的主体中声明该 viewmodel:
@Composable
private fun MyContent(){
viewmodel: BaseEnrtyWidgetViewModel = hiltViewModel()
}
并且不要忘记添加:
@HiltAndroidApp
class MyApp : Application() {
}
并添加清单文件:
android:name=".MyApp"
如果它对你有帮助,请告诉我!
评论
0赞
geontricks developer
11/9/2023
正如我所看到的,这是不可能的。 因为 TextField 一目了然。这是原因之一。另一个原因是在删除那些 textfiled 后,我在取消注释 viewmodel 和 @AndroidEntryPoint 后无法运行。发生另一个错误
0赞
Trek Ama
11/9/2023
@geontricksdeveloper 你遇到了什么错误?它们是构建错误还是?这应该在这里起作用,这是一个例子,当我使用带有匕首刀柄的视图模型时:
0赞
Trek Ama
11/9/2023
@geontricksdeveloper: 可组合的乐趣 NewsScreen() { val newsViewModel : NewsViewModel = hiltViewModel() val newsResponse = newsViewModel.newsResponse LazyColumn { items(newsResponse?.newsItems.orEmpty()){newsItem -> NewsItemCard(newsItem) } } }
评论