Chr*_* Pi 8 android kotlin android-jetpack-compose dagger-hilt
我尝试将一个简单的 viewModel 移交给可组合项,并且每次都会出现此错误,但我不知道这意味着什么:
java.lang.IllegalStateException: Given component holder class com.example.app.MainActivity does not implement interface dagger.hilt.internal.GeneratedComponent or interface dagger.hilt.internal.GeneratedComponentManager
我的摇篮:
implementation("androidx.hilt:hilt-navigation:1.0.0-beta01")
implementation("androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03")
Run Code Online (Sandbox Code Playgroud)
我已经创建了一个BaseApplication文件
import android.app.Application
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class BaseApplication: Application()
Run Code Online (Sandbox Code Playgroud)
并将其设置在清单中。
我创建了一个AppModule文件:
import android.content.Context
import com.veloce.montageservice.BaseApplication
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Singleton
@Provides
fun provideApplication(@ApplicationContext app: Context): BaseApplication {
return app as BaseApplication
}
}
Run Code Online (Sandbox Code Playgroud)
@HiltAndroidApp然后在我的中设置MainActivity并创建一个viewModel像这样的:
@HiltViewModel
class TaskViewModel: ViewModel() {
//code
}
Run Code Online (Sandbox Code Playgroud)
viewModel在我的导航中称为MainActivity:
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = Screens.LoginScreen.route
) {
composable(Screens.ActiveMontageScreen.route) { navBackStackEntry ->
activeTask?.let {
val factory =
HiltViewModelFactory(LocalContext.current, navBackStackEntry)
val viewModel: TaskViewModel = viewModel("taskViewModel", factory)
ActiveMontageScreen(
viewModel = viewModel,
task = it,
navigation = navController,
context = LocalContext.current
) {
removeActiveTask()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我真的看不出任何问题,但我对 Hilt 和 Android 开发非常缺乏经验。有谁知道有什么问题吗?
请检查这些选项:
1-您必须具有这些依赖项:
//Hilt
def hilt_version = "2.38.1"
implementation("com.google.dagger:hilt-android:$hilt_version")
kapt("com.google.dagger:hilt-android-compiler:$hilt_version")
kapt("androidx.hilt:hilt-compiler:1.0.0")
implementation("androidx.hilt:hilt-navigation-compose:1.0.0-alpha03")
implementation("androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03")
Run Code Online (Sandbox Code Playgroud)
2-您必须已将此注释添加到您的活动中
@AndroidEntryPoint
class MainActivity : ComponentActivity()
Run Code Online (Sandbox Code Playgroud)
3-您必须像这样将 viewModel 注入到屏幕中
@Composable
fun MainScreen(
viewModel: MainScreenViewModel = hiltViewModel()
)
Run Code Online (Sandbox Code Playgroud)
据我所知,几乎没有什么东西放错了地方,导致了这样的错误。
例如:
class TaskViewModel(context: Context)如果您需要上下文,则viewmodel可以使用AndroidViewModel.
您正在创建BaseApplication但AppModule没有使用它(可能在其他地方使用过)。
您可以通过以下步骤创建此类视图模型:
在清单中创建BaseApplication并注册它,您已经完成了。
创建AndroidViewModel如下:
@HiltViewModel
class TaskViewModel @Inject constructor(
application: BaseApplication
) : AndroidViewModel(application) {
fun test() {
getApplication<BaseApplication>().getString(R.string.app_name)
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,它的使用@Inject constructor将从BaseApplication中获取类AppModule。
在你的MainActivity初始化中viewmodel像这样:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: TaskViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel.test()
}
}
Run Code Online (Sandbox Code Playgroud)
如果您无法解决任何与刀柄相关的问题,请确保您具有这些依赖项build.gradle
//Dagger - Hilt
implementation "com.google.dagger:hilt-android:2.33-beta"
kapt "com.google.dagger:hilt-android-compiler:2.33-beta"
implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03"
kapt "androidx.hilt:hilt-compiler:1.0.0-beta01"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13716 次 |
| 最近记录: |