当目的地的必需参数来自可选状态变量时的 NavigationLink

Posted

技术标签:

【中文标题】当目的地的必需参数来自可选状态变量时的 NavigationLink【英文标题】:NavigationLink when destination's required parameter is from optional state variable 【发布时间】:2021-12-07 03:47:50 【问题描述】:

使用可选状态参数导航真的让我很困惑。下面的代码无法编译,因为selectedObject 必须为零合并,因为它是NextView 的要求,但我没有什么可以合并它的。 NextView 需要此参数,因此无法编译可选。 MyObject 是一个具有所有必需属性的结构,所以我没有空的构造函数。我正在使用selected 状态来管理导航何时发生,但由于可选对象,它仍然无法编译。

struct MyView: View 
    @EnvironmentObject var model: Model
    @State var selected = false
    @State var selectedObject: MyObject? // optional because there isn't one until it's set by the child view

    var body: some View 
        NavigationLink(destination: NextView(object: $selectedObject), isActive: self.$selected) 
            EmptyView()
       
       // ... child view that when interacted with sets the selectedObject as a binding ... //
    

struct MyObject: Identifiable, Codable 
   var property1: String
   var property2: String
   // .... many more ...

struct NextView: View 
    @Binding var object: MyObject // required binding
    
    var body: some View 
        Text("some stuff about my object")
    

【问题讨论】:

selectedObject 将如何获得价值?哪些动作或步骤使 selectedObject 获得了一些真正的价值? PS:您的问题很简单,但您需要确保我们可以为自己创建问题!我认为它缺少创建问题所需的代码。 几个选项: 1) 传入Binding<MyObject?> 而不是Binding<MyObject>; 2) 做一个懒惰的NavigationLink 并强制解包,如果你可以确定 selectedObject 永远不会是nil; 3) 如果selectedObjectnil,则创建一个自定义绑定以传递一些其他MyObject。由你决定如何做 【参考方案1】:

如果您确定selectedObject 将在链接激活时出现,那么您可以通过即时创建的绑定来解决这种情况,例如

    NavigationLink(destination: NextView(object:
        Binding(
            get: selectedObject!,
            set: selectedObject = $0
        )), isActive: self.$selected)  EmptyView()
    

【讨论】:

谢谢,这是我丢失的关键。我还需要将NavigationLink 包装在if 中,检查self.$selected

以上是关于当目的地的必需参数来自可选状态变量时的 NavigationLink的主要内容,如果未能解决你的问题,请参考以下文章

Argparse:“可选参数”下列出的必需参数?

PHP中来自必需/包含文件的变量变量

Dart语法之可选参数

argparse 必需参数列表与可选参数列表竞争

Python - 必需参数之前的可选参数

必需参数 $xxx 跟在可选参数 $yyy 之后