在 jetpack compose 中将 viewmodel 注入到 hilt 依赖项注入中的小部件

Inject viewmodel to widget in hilt dependency injection in jetpack compose

提问人:geontricks developer 提问时间:11/9/2023 更新时间:11/9/2023 访问量:40

问:

我使用刀柄依赖注入创建了一个喷气背包组合应用程序。我使用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(){
    //
}
Android Kotlin android-jetpack-compose android-widget 匕首-刀柄

评论

0赞 geontricks developer 11/9/2023
我评论了@AndroidEntryPoint和视图模型注入,因为这些都不起作用

答:

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) } } }