You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:40:10