Section 18 : Navigation Style and Passing Data

本文详细介绍如何在SwiftUI中创建导航列表项的详情页,包括设计详情视图、修改UpdateList视图以及如何在NavigationView中正确使用destination参数传递数据。通过实际代码演示如何保证不同数据的详情页面在显示上保持一致。

Section 18 : Navigation Style and Passing Data - 导航样式与传递数据(9’22")

Create a detail screen for your navigation list items.

为导航列表中的项目创建详情页。

上一节的详情只是显示了文字内容,现在建立一个包含更完整信息的视图来替代它。先创建为更新信息详情创建新的视图文件,命名为 UpdateDetail.swift。

1. 设计详情视图

代码如下

struct UpdateDetail: View {
    var update: Update =  updateData[0]                              // 设定用于传值的变量,并给默认值
    
    var body: some View {
        List {
            VStack(spacing: 20) {
                Image(update.image)
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .frame(maxWidth: .infinity)						 // 撑满,保持图片显示统一
                Text(update.text)
                    .frame(maxWidth: .infinity, alignment: .leading) // 撑满,左对齐,保持内容显示统一
            }
            .navigationBarTitle(update.title)       // 指明导航标题,这个在这里预览不出来,需要 Navigation
        }
    .listStyle(PlainListStyle())                    // 指明 List 的样式,另一个常用的是 GroupedListStyle
    }
}

2. 修改 UpdateList 视图

struct UpdateList: View {
    var body: some View {
        NavigationView {                  // 导航视图
            List(updateData) { update in  // 更新信息列表,数据来自 updateData
                NavigationLink(destination: UpdateDetail(update: update)) { // 导航项目,目标为更新信息的详情
                    HStack {
                        // 代码略
                    }
                    .padding(.vertical, 8)
                }
            }
        .navigationBarTitle(Text("课程更新信息"))  // 导航视图的标题
        }
    }
}

现在可以看到详情页面都可以正常显示了

本节小结

本节代码请参见 GitHub码云

  • 在 NavigationView 中的 destination 参数里调用详情页面,注意传递参数。
  • List 是与 VStack 一样的容器,但是里面的元素之间有分割线。
  • listStyle 修饰器指明 List 的样式,主要参数有 Default(),PlainListStyle(),GroupedListStyle() 等。
  • navigationBarTitle 修饰器需要在 NavigationView 容器中才能起作用。
  • 使用 frame 和设定对齐方式来保证不同数据的详情页面在显示上保持一致。
接下来

组合视图对数据进行编辑

光伏储能虚拟同步发电机VSG并网仿真模型(Similink仿真实现)内容概要:本文档介绍了光伏储能虚拟同步发电机(VSG)并网仿真模型的Simulink实现方法,重点在于通过建立光伏储能系统与虚拟同步发电机相结合的仿真模型,模拟其在并网过程中的动态响应与控制特性。该模型借鉴了同步发电机的惯性和阻尼特性,提升了新能源并网系统的频率和电压支撑能力,增强了系统的稳定性与可控性。文档还提及相关电力系统仿真技术的应用,包括逆变器控制、储能配置、并网稳定性分析等,并提供了完整的Simulink仿真文件及技术支持资源链接,便于科研人员复现与二次开发。; 适合人群:电气工程、自动化、能源系统等相关专业的研究生、科研人员及从事新能源并网技术开发的工程师。; 使用场景及目标:①用于研究光伏储能系统在弱电网条件下的并网稳定性问题;②掌握虚拟同步发电机(VSG)控制策略的设计与仿真方法;③支持高水平论文(如EI/SCI)的模型复现与创新研究;④为微电网、智能电网中的分布式能源接入提供技术参考。; 阅读建议:建议结合提供的Simulink模型文件与文档说明逐步操作,重点关注VSG控制模块的参数设置与动态响应分析,同时可延伸学习文中提及的MPPT、储能管理、谐波分析等相关技术,以提升综合仿真能力。
Duplicate class androidx.navigation.compose.BackStackEntryIdViewModel found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.ComposableSingletons$ComposeNavigatorKt found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.ComposableSingletons$ComposeNavigatorKt$lambda$127448943$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.ComposableSingletons$DialogNavigatorKt found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.ComposableSingletons$DialogNavigatorKt$lambda$-1092249270$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.ComposeNavGraphNavigator found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.ComposeNavGraphNavigator$ComposeNavGraph found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.ComposeNavigator found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.ComposeNavigator$Companion found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.ComposeNavigator$Destination found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.ComposeNavigator$Destination$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.ComposeNavigatorDestinationBuilder found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.DialogHostKt found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.DialogHostKt$DialogHost$1$2 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.DialogHostKt$DialogHost$1$2$2 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.DialogHostKt$DialogHost$1$2$invoke$lambda$2$lambda$1$$inlined$onDispose$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.DialogHostKt$DialogHost$2$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.DialogHostKt$PopulateVisibleList$lambda$12$lambda$11$lambda$10$$inlined$onDispose$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.DialogNavigator found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.DialogNavigator$Companion found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.DialogNavigator$Destination found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.DialogNavigatorDestinationBuilder found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavBackStackEntryProviderKt found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavGraphBuilderKt found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavGraphBuilderKt$composable$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavHostControllerKt found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavHostControllerKt__NavHostControllerKt found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavHostKt found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavHostKt$NavHost$25$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavHostKt$NavHost$25$1$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavHostKt$NavHost$28$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavHostKt$NavHost$29$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavHostKt$NavHost$29$1$1$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavHostKt$NavHost$32 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavHostKt$NavHost$32$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavHostKt$NavHost$33$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavHostKt$NavHost$lambda$48$lambda$47$$inlined$onDispose$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.NavHostKt$NavHost$lambda$69$lambda$68$$inlined$onDispose$1 found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Duplicate class androidx.navigation.compose.internal.WeakReference found in modules navigation-compose-jvmstubs-2.9.0.jar -> navigation-compose-jvmstubs-2.9.0 (androidx.navigation:navigation-compose-jvmstubs:2.9.0) and navigation-compose-release.aar -> navigation-compose-release-runtime (androidx.navigation:navigation-compose-android:2.9.0) Learn how to fix dependency resolution errors at https://d.android.com/r/tools/classpath-sync-errors
05-28
### 解决 Android 项目中 `navigation-compose` 版本 2.9.0 的重复类冲突问题 在处理 Android 项目时,如果遇到类似 `Duplicate class androidx.navigation.compose.BackStackEntryIdViewModel` 的问题,通常是因为多个依赖项引入了同名的类。以下是针对该问题的专业解决方案。 #### 确保依赖版本一致性 重复类问题通常源于不同模块或库之间存在版本冲突。为了解决此问题,需要确保所有与 `navigation` 相关的依赖项使用相同的版本号。例如,在 `build.gradle` 文件中添加以下内容: ```gradle def nav_version = "2.9.0" implementation "androidx.navigation:navigation-compose:$nav_version" implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version" ``` 通过统一版本号,可以避免因版本不一致导致的重复类问题[^1]。 #### 排查冲突来源 如果仍然存在重复类问题,可以通过运行以下命令来检查依赖树并定位冲突来源: ```bash ./gradlew app:dependencies ``` 此命令将输出项目的完整依赖树,帮助识别哪些依赖项引入了冲突的类。例如,如果发现某些第三方库也包含 `androidx.navigation` 的相关类,则需要排除这些冲突的依赖项[^3]。 #### 使用 `exclude` 排除重复依赖 在 Gradle 中,可以使用 `exclude` 关键字来排除特定的依赖项。例如,如果某个第三方库引入了旧版本的 `navigation-compose`,可以通过以下方式排除它: ```gradle implementation("com.some.library:some-library:1.0.0") { exclude group: 'androidx.navigation', module: 'navigation-compose' } ``` 通过这种方式,可以确保项目中只包含一个版本的 `navigation-compose`[^3]。 #### 强制指定依赖版本 如果无法直接排除冲突的依赖项,可以使用 Gradle 的强制版本策略来确保所有模块使用相同的版本。例如: ```gradle configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.group == 'androidx.navigation') { details.useVersion "2.9.0" } } } ``` 此配置会强制所有 `androidx.navigation` 的依赖项使用版本 `2.9.0`,从而避免版本冲突[^2]。 #### 检查 Maven 仓库连接 如果在构建过程中遇到类似 `Could not GET 'https://maven.google.com/androidx/navigation/navigation-runtime/maven-metadata.xml'. > Connect to maven.google.com:443 [maven.google.com/172.217.24.14] failed: connect timed out` 的错误,可能是由于网络问题导致无法访问 Maven 仓库。可以尝试以下方法解决: - 确保项目中的 `repositories` 配置正确,包含 Google 的 Maven 仓库: ```gradle repositories { google() mavenCentral() } ``` - 如果网络环境受限,可以考虑使用代理或切换到国内镜像源,例如阿里云的 Maven 仓库[^2]。 --- ### 示例代码:完整的 `build.gradle` 配置 以下是一个完整的 `build.gradle` 配置示例,展示了如何解决 `navigation-compose` 的重复类问题: ```gradle plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } android { compileSdk 34 defaultConfig { applicationId "com.example.app" minSdk 21 targetSdk 34 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = '17' } } dependencies { def nav_version = "2.9.0" // Navigation Compose implementation "androidx.navigation:navigation-compose:$nav_version" implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version" // Exclude conflicting dependencies implementation("com.some.library:some-library:1.0.0") { exclude group: 'androidx.navigation', module: 'navigation-compose' } // Other dependencies implementation "androidx.core:core-ktx:1.12.0" implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.2" } // Force dependency versions configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.group == 'androidx.navigation') { details.useVersion "2.9.0" } } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值