Android应用DataStore实现明暗模式启动闪烁问题求助
问题:应用启动时明暗模式切换出现闪烁
使用DataStore开发明暗模式切换功能,启动应用时会先跟随设备系统明暗模式显示,随后突然切换为用户在应用内设置的模式,出现明显闪烁现象。
相关代码
HomeMenuActivity类
class HomeMenuActivity : AppCompatActivity() { //UI elements private lateinit var settingsButton: ConstraintLayout //primitive values private var booleanNightMode: Boolean = false //instantiations private lateinit var appSettingsDarkModeViewModel: AppSettingsDarkModeViewModel override fun onCreate(savedInstanceState: Bundle?) { installSplashScreen() super.onCreate(savedInstanceState) setContentView(R.layout.activity_home_menu) setupUI() } private fun setupUI(){ settingsButton = findViewById(R.id.button_settings) loadDataStoreValues() } private fun loadDataStoreValues(){ appSettingsDarkModeViewModel = ViewModelProvider(this)[AppSettingsDarkModeViewModel::class.java] Handler(Looper.getMainLooper()).postDelayed({ appSettingsDarkModeViewModel.getTheme.observe(this){ pref -> booleanNightMode = pref } settings() },0) } private fun settings(){ Handler(Looper.getMainLooper()).postDelayed({ if(booleanNightMode){ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) } else{ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) } setupButtons() },50) } private fun setupButtons(){ settingsButton.setOnClickListener{ val nextPage = Intent(this, SettingsMenuActivity::class.java) startActivity(nextPage) finish() } } }
AppSettingsDarkModeDataStore类
private val Context.dataStore by preferencesDataStore("THEME_KEY") class AppSettingsDarkModeDataStore(context: Context) { private val dataStore = context.dataStore companion object { val darkModeKey = booleanPreferencesKey("DARK_MODE_KEY") } suspend fun setTheme(isDarkMode : Boolean){ dataStore.edit { pref -> pref[darkModeKey] = isDarkMode } } val getTheme : Flow<Boolean> = dataStore.data .catch { exception -> if(exception is IOException) { emit(emptyPreferences()) } else { throw exception } } .map { pref -> val uiMode = pref[darkModeKey] ?: false uiMode } }
AppSettingsDarkModeViewModel类
class AppSettingsDarkModeViewModel(application: Application): AndroidViewModel(application) { private val repository = AppSettingsDarkModeDataStore(application) val getTheme = repository.getTheme.asLiveData() fun setTheme(isDarkMode : Boolean) = viewModelScope.launch { repository.setTheme(isDarkMode) } }
已尝试的解决方案
- 在ViewModel及HomeMenuActivity中使用
runBlocking,导致页面跳转时屏幕出现黑白闪烁 - 在
asLiveData中指定Dispatchers.IO,未解决问题
内容的提问来源于stack exchange,提问作者mi-ned32
相关产品推荐
相关产品推荐

