如何切换 NavigationView 的第三个窗格的可见性?

问题描述

假设有以下 NavigationView:

Struct ContentView: View {
   @State var showRigthPane: Bool = true 

   var body: some View {
       NavigationView {
           Sidebar()
           MiddlePane()
           RightPane()
       }.toolbar {
           ToolbarItem(placement: .navigation) {
                Button(action: toggleSidebar,label: {Image(systemName: "sidebar.left")})
            }
           ToolbarItem(placement: .primaryAction) {
               Button(action: self.toggleRightPane,label: { Image() })
           }
       }
   }

   private func toggleRightPane() {
       // ?
   }
   
   // collapsing sidebar - this works
   private func toggleSidebar() {
        NSApp.keyWindow?.initialFirstResponder?.tryToPerform(
            #selector(NssplitViewController.toggleSidebar(_:)),with: nil)
    }

}

如何实现 toggleRightPane() 函数来切换右窗格的可见性?

解决方法

更新以使用返回两个不同导航视图的计算属性。侧边栏的行为仍然很奇怪,但有一个变通办法,它是有用的。希望有人能弄清楚侧边栏的行为。

`import 'package:http/http.dart' as http;
 import 'Events.dart';
 class Services {

  //
  static const String url = 'https://my-json- 
  server.typicode.com/skrfffe1/deas/events';

  static Future<List<Events>> getEvents() async{
  try {
    final response = await http.get(url);
    if (200 == response.statusCode) {
        final List<Events> events = 
     eventsFromMap(response.body).cast<Events>();
        return events;
    } else {
         return List<Events>();
    }
   } catch (e) {

    return List<Events>();
  }
 }

 }`
 
,

尝试以下(无法测试)

struct ContentView: View {
   @State private var showRigthPane = true 

   var body: some View {
       NavigationView {
           Sidebar()
           MiddlePane()
           if showRigthPane {    // << here !!
               RightPane()
           }
       }.toolbar {
           ToolbarItem(placement: .primaryAction) {
               Button(action: self.toggleRightPane,label: { Image() })
           }
       }
   }

   private func toggleRightPane() {
       withAnimation {
          self.showRigthPane.toggle()     // << here !!
       }
   }
}