Skip to content

ObservationView不修改body的改进尝试 #1

@winddpan

Description

@winddpan

通过_makeView可以不修改body的实现达成
inspired

struct ContentView: View {
  private var person = Person(name: "Tom", age: 12)

  var body: some View {
    VStack {
      Text(person.name)
      Text("\(person.age)")
      HStack {
        Button("+") { person.age += 1 }
        Button("-") { person.age -= 1 }
      }
      .padding()
    }
  }

  @ViewBuilder
  private var observationView: ObservationView<Body> {
    ObservationView {
      body
    }
  }

  static func _makeView(view: SwiftUI._GraphValue<Self>, inputs: SwiftUI._ViewInputs)
    -> SwiftUI._ViewOutputs
  {
    return ObservationView<Body>._makeView(view: view[\.observationView], inputs: inputs)
  }

  static func _makeViewList(view: SwiftUI._GraphValue<Self>, inputs: SwiftUI._ViewListInputs)
    -> SwiftUI._ViewListOutputs
  {
    return ObservationView<Body>._makeViewList(view: view[\.observationView], inputs: inputs)
  }

  static func _viewListCount(inputs: SwiftUI._ViewListCountInputs) -> Int? {
    return ObservationView<Body>._viewListCount(inputs: inputs)
  }
}

包装一个协议

protocol ObservationBPView: View {}

extension ObservationBPView {
  @ViewBuilder
  private var observationView: ObservationView<Body> {
    ObservationView {
      body
    }
  }

 static func _makeView(view: SwiftUI._GraphValue<Self>, inputs: SwiftUI._ViewInputs)
    -> SwiftUI._ViewOutputs
  {
    return ObservationView<Body>._makeView(view: view[\.observationView], inputs: inputs)
  }

 static func _makeViewList(view: SwiftUI._GraphValue<Self>, inputs: SwiftUI._ViewListInputs)
    -> SwiftUI._ViewListOutputs
  {
    return ObservationView<Body>._makeViewList(view: view[\.observationView], inputs: inputs)
  }

 static func _viewListCount(inputs: SwiftUI._ViewListCountInputs) -> Int? {
    return ObservationView<Body>._viewListCount(inputs: inputs)
  }
}


struct ContentView: ObservationBPView {
  ...
}

包装一个Macro

@ObservationBPView
struct ContentView: View {
  ...

  // Macro expends below
  @ViewBuilder
  private var observationView: ObservationView<Body> {
    ObservationView {
      body
    }
  }

  static func _makeView(view: SwiftUI._GraphValue<Self>, inputs: SwiftUI._ViewInputs)
    -> SwiftUI._ViewOutputs
  {
    return ObservationView<Body>._makeView(view: view[\.observationView], inputs: inputs)
  }

  static func _makeViewList(view: SwiftUI._GraphValue<Self>, inputs: SwiftUI._ViewListInputs)
    -> SwiftUI._ViewListOutputs
  {
    return ObservationView<Body>._makeViewList(view: view[\.observationView], inputs: inputs)
  }

  static func _viewListCount(inputs: SwiftUI._ViewListCountInputs) -> Int? {
    return ObservationView<Body>._viewListCount(inputs: inputs)
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions