【发布时间】:2020-10-08 08:19:52
【问题描述】:
我的 SwiftUI 应用中的深层链接存在问题。
在我的应用程序类中,我已将 deepLink 声明为层次结构中 ContentView() 下每个视图的环境变量:
...
@main
struct TestApp: App {
var userSettings: UserSettings
var dataFetcher: DataFetcher
var dataUpdater: DataUpdater
@State var deepLink = ""
init() {
userSettings = UserSettings()
dataFetcher = DataFetcher(userSettings: userSettings)
dataUpdater = DataUpdater(userSettings: userSettings)
}
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(userSettings)
.environmentObject(dataFetcher)
.environmentObject(dataUpdater)
.onOpenURL { url in
deepLink = url.absoluteString
}
.environment(\.deepLink, deepLink)
}
}
}
在我的 ContentView() 中,我将 deepLink 声明为环境变量
struct ContentView: View {
...
@State var isTestSheetViewPresented = false
@Environment(\.deepLink) var deepLink: String
...
var body: some View {
Button(action: {
self.isTestSheetViewPresented = true
}, label: {
HStack {
Spacer()
Image(systemName: "plus")
Text("Add")
Spacer()
}
})
.sheet(isPresented: $isTestSheetViewPresented, content: {
TestSheetView(isPresented: self.$isTestSheetViewPresented)
})
.onChange(of: self.deepLink) { _ in
self.isTestSheetViewPresented = true
}
}
}
而TestSheetView是这样的
struct TestSheetView: View {
@Environment(\.deepLink) var deepLink: String
@State var url: String = ""
var body: some View {
Text(url)
.onChange(of: deepLink) { _ in
if deepLink != "" {
self.url = deepLink
}
}
}
}
问题是,当我点击一个链接并打开我的应用程序时,TestSheetView 会正确显示,但除非我向下滚动一点,否则不会触发 onChange。
相反,如果我将 TestSheetView 的相同代码放在 ContentView 中,则文本会正确显示
【问题讨论】:
-
似乎是时间问题。在初始化
TestSheetView时,body是在deepLink更改之后创建的,因此它无法检测到它。解决方案可能是您在TestSheetView中使用onAppear并从那里读取,或者您从ContentView传入deepLink。如果您需要完整的解决方案,请告诉我。 -
@George_E 啊,是时间问题。添加 onAppear() 修复它!如果您想发布答案,我会将其标记为解决方案。谢谢
-
谢谢 - 也只是一个小评论,而不是
deepLink != "",最好使用!deepLink.isEmpty。不仅仅是为了可读性,还有性能,虽然差别不会很大。