Android Studio 无法在jetpack合成中设置数据存储

bqjvbblv  于 8个月前  发布在  Android
关注(0)|答案(1)|浏览(75)

我做了一个简单的函数来存储一个长值。
UserPreferencesRepository.kt

class UserPreferencesRepository(
    private val dataStore: DataStore<Preferences>
) {
    private companion object {
        val TIME_START = longPreferencesKey("time_start")
        const val TAG = "UserPreferencesRepo"
    }

    suspend fun saveTimePreference(theTime : Long){
        dataStore.edit { preferences ->
            preferences[TIME_START] = 0L
        }
    }

    val dateTime: Flow<Long> = dataStore.data
        .catch {
            if (it is IOException) {
                Log.e(TAG, "Error reading preferences.", it)
                emit(emptyPreferences())
            } else {
                throw it
            }
        }
        .map { preferences ->
            preferences[TIME_START] ?: 0L
        }
}

然后把它添加到我的视图模型中。
HomeViewModel.kt

class HomeViewModel(
    private val userPreferencesRepository: UserPreferencesRepository
) : ViewModel() {
   // Implemented nothing yet
}

这个阶段,代码工作得很好,但是当我把这个视图模型添加到我的组合中时,它就被压碎了。
我试过这种方法,

@Composable
fun HomeScreen(
){
    val viewModel = viewModel<HomeViewModel>()
}

这样

@Composable
fun HomeScreen(
   homeViewModel: HomeViewModel = viewModel()
){
   
}

每当我这样做时,应用程序就会崩溃。这个错误说,

Cannot create an instance of class com.playmakers.lifemetrics.ui.screens.home.HomeViewModel

我怎样才能解决这个问题,或者建议我正确的方法。

gdx19jrr

gdx19jrr1#

您的ViewModel需要UserPreferencesRepository的示例,您将其声明为构造函数参数。但是你调用的viewModel()函数没有仓库示例,这就是为什么它不能示例化你的HomeViewModel类。
要解决这个示例化问题,您必须为viewModel类提供存储库示例,以便它可以被示例化。
你可以像下面这样创建一个Factory类:

class HomeViewModelFactory(
    private val repository: UserPreferencesRepository
): ViewModelProvider.Factory {

    @Suppress("UNCHECKED_CAST")
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return HomeViewModel(repository) as T
    }
}

现在,你可以通过传递工厂示例来获取ViewModel类的示例,如下所示:

@Composable
fun HomeScreen(){
    val context = LocalContext.current
    val repository = UserPreferencesRepository(context.dataStore)

    val viewModel = viewModel(HomeViewModel::class.java, factory = HomeViewModelFactory(repository))
}

相关问题