0

ビューの関数内の@EnvironmentObject(またはその他の)に依存するいくつかの内部変数を初期化するより自然な方法 (現在は 2022 年) はありますか?@ObservedObjectinit()

たとえば、次の図は、私がやろうとしていること (コメント アウト) と機能することを示しています。残念ながら、「機能する」コードはかなり扱いにくい (かさばる、反復的) です。単にdiaryvar を使用する代わりに、コードを振りかける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 が少し進化していることを願っています。

4

1 に答える 1