SwiftUI:为什么@AppStorage的工作方式不同于我的自定义绑定?



我有一个模态呈现的Sheet应该基于UserDefaultbool显示。我写了一个UI-Test,它会关闭表单,我使用启动参数来控制默认值。

然而,当我最初尝试使用@AppStorage时,它似乎没有坚持值,或者秘密地不写它?我的测试失败了,因为在"解散"后,模态会弹出,因为值不变。

为了解决这个问题,我编写了一个自定义绑定。但我不确定这两个实现之间的行为差异是什么?测试通过如下方式。

有谁知道我不明白什么,对不起?

干杯!

<标题>

简单例子1。AppStorage

struct ContentView: View {
@AppStorage("should.show.sheet") private var binding: Bool = true
var body: some View {
Text("Content View")
.sheet(isPresented: $binding) {
Text("Sheet")
}
}
}

2。定制绑定:

struct ContentView: View {
var body: some View {
let binding = Binding<Bool> {
UserDefaults.standard.bool(forKey: "should.show.sheet")
} set: {
UserDefaults.standard.set($0, forKey: "should.show.sheet")
}

Text("Content View")
.sheet(isPresented: binding) {
Text("Sheet")
}
}
}

测试用例:

final class SheetUITests: XCTestCase {
override func setUpWithError() throws {
continueAfterFailure = false
}

func testDismiss() {
// Given 'true' userdefault value to show sheet on launch
let app = XCUIApplication()
app.launchArguments += ["-should.show.sheet", "<true/>"]
app.launch()

// When the user dismisses the modal view
app.swipeDown()

// Wait a second for animation (make sure it doesn't pop back)
sleep(1)

// Then the sheet should not be displayed
XCTAssertFalse(app.staticTexts["Sheet"].exists)
}
}
  1. 即使在运行应用程序时也不工作,因为";在键名(看起来这是AppStorage的限制,所以使用简单的符号,如isSheet)

  2. IMO测试用例是不正确的,因为它覆盖了默认参数域,但它是只读的,所以写入是尝试到持久域,但那里可能有相同的值,所以没有更改(读取didSet)事件生成,所以没有更新UI。

  3. 要测试这一点,应该在应用程序中的配对事件,即。一个给AppStoragetrue,另一个给false

*注意:布尔值在参数中表示为0/1(不是XML),如-isSheet 1

相关内容

  • 没有找到相关文章

最新更新