将 compose 升级到以下版本后,我遇到了一个奇怪的错误1.0.0-beta08:
java.lang.IllegalStateException: Check failed.
at androidx.compose.ui.node.OuterMeasurablePlaceable.getLastConstraints-msEJaDk(OuterMeasurablePlaceable.kt:36)
at androidx.compose.ui.node.LayoutNode.remeasure-BRTryo0$ui_release$default(LayoutNode.kt:1202)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-0kLqBqw(MeasureAndLayoutDelegate.kt:171)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$doRemeasure-0kLqBqw(MeasureAndLayoutDelegate.kt:38)
at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:207)
at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:501)
at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:650)
at android.view.View.draw(View.java:22353)
at android.view.View.updateDisplayListIfDirty(View.java:21226)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
at android.view.View.updateDisplayListIfDirty(View.java:21186)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
at android.view.View.updateDisplayListIfDirty(View.java:21186)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
at android.view.View.updateDisplayListIfDirty(View.java:21186)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4500)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4473)
at android.view.View.updateDisplayListIfDirty(View.java:21186)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:559)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:565)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:642)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:4106)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3833)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3104)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1948)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8177)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:731)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223) …Run Code Online (Sandbox Code Playgroud) 据我所知,在 jetpack-compose 之前,最好的做法是拥有一个 Activity,然后为您的应用程序使用多个片段。但是现在 jetpack compose 提供了 jetpack compose 功能之间的导航,所以我们现在需要片段吗?或者,如果我们不再需要片段,我们可以只使用具有多个屏幕的单个活动(撰写功能),我如何在仅使用单个活动和撰写功能的同时在数据库中添加/编辑、获取上下文等内容。我仍然是一个初学者/学习者,所以我可能会错过一些东西或做错一些事情。
我在 Jetpack Compose 应用程序的项目中设置了一个带有 2 个目的地的底部栏。我尝试遵循谷歌的示例。
例如,它看起来像这样:
@Composable
fun ExampleBottomBar(navController: NavHostController) {
val items = listOf(
BottomNavigationGraph.Graph1,
BottomNavigationGraph.Graph2
)
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = navBackStackEntry?.destination
BottomNavigation {
items.forEach { screen ->
BottomNavigationItem(
onClick = {
navController.navigate(screen.route) {
popUpTo(navController.graph.findStartDestination().id) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
},
selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true,
icon = { Icon(imageVector = screen.icon, contentDescription = null) },
label = { Text(stringResource(screen.label)) }
)
} …Run Code Online (Sandbox Code Playgroud) android android-navigation android-architecture-navigation android-jetpack-compose jetpack-compose-navigation
我正在尝试找到一种解决方案来显示多个底部工作表,以适应我们的用户体验/设计。
目前一直在尝试使用Accompanist和Compose Navigation Reimagined,但没有成功。似乎 BottomSheets 的内置内部工作方式一次只能显示,例如显示一张纸、隐藏它并交换内容并显示“新纸”。
问题可能与accompanist 上的这个 github 问题有些相关
Essentially what i'm trying to do is being able to have a "stack" of bottomsheets on top of each other. I've been trying to make things work with the compose navigation, but having issues with background colors and replicating the "bottom sheet" overlay when the screen enters.
Any one who has found a way to implement something along the lines of what i'm trying?
android android-navigation android-jetpack-compose jetpack-compose-navigation jetpack-compose-accompanist
我有一个可组合项,需要在调用时从本地房间数据库中获取一些数据。当我导航到另一个可组合项然后导航回来时,它应该再次获取数据。
我在 LaunchedEffect 块中获取数据。我正在使用Compose Destinations Library 进行导航。
@Composable
fun DataScreen(navigator: DestinationsNavigator) {
val viewModel = viewModel<DataScreenViewModel>()
LaunchedEffect(Unit) {
viewModel.fetchData()
}
Button(onClick = { navigator.navigate(EditScreenDestination) }) {
Text("Edit")
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我离开此可组合项并使用导航回到它时,navigator.popBackStack()我想重新获取数据,因为它可能已更改。
有没有办法可以检测到用户在我的 DataScreen 可组合项中导航回来?
或者有没有更好的方法来实现这一点。
android kotlin android-jetpack-compose jetpack-compose-navigation
我在 Jetpack Compose 与导航结合使用时遇到了奇怪的行为:如果您在某些导航可组合项中使用 RememberSaveable,则状态不会按承诺保存(例如,旋转后会丢失)。这是一个简单的例子:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material.MaterialTheme
import androidx.compose.material.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MaterialTheme {
MyScreen()
}
}
}
}
@Composable
fun MyScreen() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "xyz") {
composable("xyz") {
var value by rememberSaveable { mutableStateOf("") }
TextField(value = value, onValueChange = …Run Code Online (Sandbox Code Playgroud) android-architecture-navigation android-jetpack-compose jetpack-compose-navigation
所以我想要实现的是:
借助此处答案,我可以通过将脚手架封装在 ModalBottonSheetLayout 内来实现上述目标:Jetpack Compose Scaffold + Modal Bottom Sheet
问题:
我怎样才能做到这一点?主可组合项没有有关其托管的可组合项中存在的惰性列内的项目的任何信息。
有没有不同的方法来解决这个问题?
这是我的代码:
HomeComposable.kt
fun HomeComposable(homeViewModel: HomeViewModel,
navController: NavHostController) {
ModalBottomSheetLayout(
sheetContent = {
//get the id of the message here so it can be
//deleted
Button(
text = "delete Message")
onClick = deleteMessage(message.id
)
}
) {
Scaffold(
content = {
NavHost(navController = navController, startDestination =
WHATS_NEW_COMPOSABLE) {
composable(MESSAGES_COMPOSABLE) {
MessageItemsComposable(
homeViewModel,
navController, …Run Code Online (Sandbox Code Playgroud) android android-jetpack-compose android-jetpack-compose-scaffold android-jetpack-compose-list jetpack-compose-navigation
我正在尝试在 内使用 Jetpack Compose 导航viewModel。当导航被触发时,什么也不会发生。这是我的方法:
我定义NavigationDestination. 就我而言,我有四个屏幕:欢迎、登录、注册和调查
interface NavigationDestination {
val route: String
}
sealed class Screen(override val route: String) : NavigationDestination {
object WelcomeScreen : Screen("welcome")
object SignInScreen : Screen("signIn")
object SignUpScreen : Screen("signUp")
object SurveyScreen : Screen("survey")
}
Run Code Online (Sandbox Code Playgroud)
,它Navigator使用默认屏幕 公开当前目的地WelcomeScreen。
class Navigator {
var destination: MutableStateFlow<NavigationDestination> = MutableStateFlow(Screen.WelcomeScreen)
fun navigate(destination: NavigationDestination) {
this.destination.value = destination
}
}
Run Code Online (Sandbox Code Playgroud)
在主可组合项中,我获取NavHostController并监听 的更改Navigator。
@Composable
fun JetSurvey0App() {
val welcomeViewModel: WelcomeViewModel …Run Code Online (Sandbox Code Playgroud) android kotlin android-jetpack-compose jetpack-compose-navigation
使用 Jetpack Compose 导航时,是为所有屏幕使用一个 ViewModel 还是为每个屏幕使用一个 ViewModel?有这方面的架构指导吗?如果要使用多个 ViewModel,将在哪里实例化它们?
当使用WebView显示HTML内容,并使用新的Activity显示新页面时,当打开/关闭新的WebView活动时,操作系统会自动保留和恢复所有WebView的状态。这带来了不间断的反向导航用户体验。
话虽如此,我想知道在使用Jetpack Compose Navigation或任何围绕它提供高级导航 API 的第三方库时是否可以复制这样的体验?如果我理解正确的话,当前的问题是在单活动架构下,可组合项被完全处置和重新创建。我们需要在生命周期感知组件(例如 ViewModel)中保留持久状态。问题是,我找不到一种方法来使用 WebView 来实现这一点,即使使用Accompanist库提供的方法也是如此。缺乏完整的状态恢复会导致返回时丢失当前加载的页面以及滚动位置,从而极大地损害用户体验。我尝试了课堂上的方法saveState和restoreState方法WebView,但没有成功。因此,如果有人能够展示一个工作示例,说明如何在使用 Compose 导航 API 时在反向导航时完全保存和恢复 WebView 的状态,我将不胜感激。
android webview android-jetpack-compose jetpack-compose-navigation