小编Nic*_*age的帖子

Jetpack Compose:如何以编程方式 onClick 将主题从浅色模式更改为深色模式

TL;DR 更改主题并在单击时在浅色和深色主题之间重新组合应用程序。

你好!我有一个有趣的问题,我一直在努力解决,希望得到一些帮助。我正在尝试实现一个设置屏幕,让用户更改应用程序的主题(选择与系统设置匹配的深色、浅色或自动)。

我在选择调色板时通过调用isSystemInDarkTheme()函数成功地动态设置了主题,但我很难通过单击按钮在浅色和深色主题之间重新组合应用程序。

我现在的策略是创建一个主题模型,该模型从用户实际在其中选择主题的设置组件中提升状态。然后,该主题模型将主题状态变量公开给自定义主题(围绕材质主题),以决定是否选择浅色或深色调色板。这是相关代码-->

主题

@Composable
fun CustomTheme(
themeViewModel: ThemeViewModel = viewModel(),
content: @Composable() () -> Unit,
) {
   val colors = when (themeViewModel.theme.value.toString()) {
       "Dark" -> DarkColorPalette
       "Light" -> LightColorPalette
       else -> if (isSystemInDarkTheme()) DarkColorPalette else LightColorPalette
   }

   MaterialTheme(
       colors = colors,
       typography = typography,
       shapes = shapes,
       content = content
   )
   }
Run Code Online (Sandbox Code Playgroud)

主题模型和状态变量

class ThemeViewModel : ViewModel() {
private val _theme = MutableLiveData("Auto")
val theme: LiveData<String> = _theme

fun onThemeChanged(newTheme: String) {
    when …
Run Code Online (Sandbox Code Playgroud)

android android-theme kotlin android-jetpack android-jetpack-compose

18
推荐指数
3
解决办法
3万
查看次数

Jetpack Compose MutableLiveData 不更新 UI 组件

我试图通过包含下载 ID 和进度值的数据对象列表一次显示多个下载进度条。此对象列表的值正在正确更新(通过日志记录显示),但 UI 组件在其初始值从 null 更改为第一个进度值后将不会更新。请帮忙!

我看到有类似的问题,但他们的解决方案对我不起作用,包括附加观察员。

class DownLoadViewModel() : ViewModel() {
   ...
   private var _progressList = MutableLiveData<MutableList<DownloadObject>>()
   val progressList = _progressList // Exposed to the UI.
   ...
   
   //Update download progress values during download, this is called 
   // every time the progress updates.
   val temp = _progressList.value
   temp?.forEach { item ->
      if (item.id.equals(download.id)) item.progress = download.progress
   }
   _progressList.postValue(temp)
   ...
}
Run Code Online (Sandbox Code Playgroud)

用户界面组件

@Composable
fun ExampleComposable(downloadViewModel: DownloadViewModel) {
    val progressList by courseViewModel.progressList.observeAsState()
    val currentProgress = progressList.find { item -> item.id == …
Run Code Online (Sandbox Code Playgroud)

android viewmodel android-livedata android-jetpack android-jetpack-compose

6
推荐指数
1
解决办法
1万
查看次数

有没有办法通过单击 Compose 支架中 TopAppBar 中的 IconButton 来打开网页?

我是 Jetpack 的新手,尤其是 Compose,并且正在努力寻找一种方法来打开网站或通过单击位于 TopAppBar 中的 IconButton 来启动 Chrome 浏览器。我应该通过调用我可以编写的“linkToWebpage()”函数来执行此操作,还是简单地与 IconButton 的 onClick = {} 函数内联来执行此操作?我该怎么做?我正在使用导航库进行应用内导航,并取得了巨大成功,但在加载网页时遇到了困难。请注意,为了便于阅读,我省略了一些代码。感谢您的时间和帮助!

@Composable
fun HomeScreen() {
   val navController = rememberNavController()

   ...

Scaffold(
        topBar = {
            TopAppBar(
                    title = {},
                    navigationIcon =
                    {
                        IconButton(onClick = { linkToWebpage() }) {
                            Icon(Icons.Filled.Favorite)
                        }
                    }
                    ,
                    // TODO get appbar color from global theme.
                    backgroundColor = Color.DarkGray,
            )
        },
        bottomBar = {       
           ...
        }
) {

    NavHost(navController, startDestination = Screen.Courses.route) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack android-jetpack-compose

1
推荐指数
1
解决办法
1582
查看次数

使用 ViewModel 时出现 Jetpack Compose DataStore 错误,“Viewmodel 没有零参数构造函数”

我正在努力在 Android Jetpack Compose 中实现 DataStore 首选项库,以在我的应用程序中保留一些用户设置。每当我尝试从可组合组件访问 SettingsViewModel 时,应用程序就会崩溃并收到以下错误:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.boldmethod, PID: 5415
java.lang.RuntimeException: Cannot create an instance of class com.boldmethod.Models.SettingsViewModel
    ...
 Caused by: java.lang.InstantiationException: java.lang.Class<com.packageName.Models.SettingsViewModel> has no zero argument constructor
Run Code Online (Sandbox Code Playgroud)

我正在按照文档创建数据存储和视图模型,所以也许我没有在可组合项中正确使用它们。这是相关的源代码:

摇篮

dependencies {

// Kotlin/Core
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.20"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'

// Compose
implementation "androidx.compose.ui:ui:1.0.0-alpha08"
implementation "androidx.compose.material:material:1.0.0-alpha08"
implementation "androidx.compose.runtime:runtime:1.0.0-alpha08"
implementation "androidx.compose.runtime:runtime-livedata:1.0.0-alpha08"
implementation "androidx.compose.runtime:runtime-rxjava2:1.0.0-alpha08"

// Navigation
def nav_compose_version = "1.0.0-alpha03"
implementation "androidx.navigation:navigation-compose:$nav_compose_version"

// Architecture
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha05"
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
//implementation "android.arch.lifecycle:runtime:2.1.0"

// UI/Material
implementation 'com.google.android.material:material:1.2.1'
implementation …
Run Code Online (Sandbox Code Playgroud)

android android-viewmodel android-jetpack android-jetpack-compose android-jetpack-datastore

1
推荐指数
1
解决办法
2259
查看次数