ビューの関数内の@EnvironmentObject
(またはその他の)に依存するいくつかの内部変数を初期化するより自然な方法 (現在は 2022 年) はありますか?@ObservedObject
init()
たとえば、次の図は、私がやろうとしていること (コメント アウト) と機能することを示しています。残念ながら、「機能する」コードはかなり扱いにくい (かさばる、反復的) です。単にdiary
var を使用する代わりに、コードを振りかけるtry? log.readDiary(for: state.now)
か、すべてをサブビューでラップする必要があります。ベストプラクティスとは何かを考えています。
struct NutritionView: View {
let log: LogProvider
@ObservedObject private var state: StateService
// @StateObject private var diary: DiaryReader? // init depends on using state (above)
init(log: LogProvider) {
// self.diary = try? log.readDiary(for: state.now) // would like to init here
// unfortunately `self.state` not available inside init()
}
var body: some View {
// let remaining = remainingCalories(diary: diary, goals: goals) // and use `diary` here
let remaining = remainingCalories(diary: try? log.readDiary(for: state.now), goals: goals)
VStack {
...
}
}
}
ここに関連する投稿があります: Swiftui - How do I initialize an observedObject using an environmentobject as a parameter? 、しかし、単純な初期化のように見えるものを達成するために内部サブビューを作成したくありません。それはただ...無駄で、繰り返しが多く、扱いにくいようです。それ以来、API が少し進化していることを願っています。