【问题标题】:Flutter Appbar (actions) with child tabs带有子选项卡的 Flutter Appbar(操作)
【发布时间】:2019-05-10 03:59:34
【问题描述】:

我是 Flutter 的新手,不知道您能否帮我找到解决问题的方法。

我有一个带有标签视图的脚手架,我想在主应用栏中创建一个过滤器(操作按钮)来管理标签。

main 和 child 都是 StatefulWidgets

这是我的主页代码:

Widget body = TabBarView(
      controller: tabController,
      children: <Widget>[
        new First(filter: filter),
        new Second(filter: filter);
        new Third(filter: filter);
      ],
    );
return Scaffold(
    appBar: AppBar(
           actions:[IconButton(icon: Icon(MdiIcons.filter),onPressed: 
           () {
              // Send info to child 
           })],
           bottom: new TabBar(
           controller: tabController,
           tabs: <Tab>[
             new Tab(text:"Tab1"),
             new Tab(text:"Tab2"),
             new Tab(text:"Tab3")
           ],
    body: new Builder(builder: (BuildContext context) {
      _scaffoldContext = context;
      return body;
    }));
));

儿童页面:

Widget body = Text("Filter name here");
return Scaffold(
  body: 
  new Builder(
    builder: (context) {
      snack = new DisplaySnackBar(context: context);
      return body;
    }),
);
}

我不知道在哪里放置 appbar 的动作以从主页更改孩子身体上的文本。

【问题讨论】:

  • 什么是你的 - 第一(过滤器:过滤器),?
  • First(filer:filter) 是第一个孩子(Tab)class First extends StatefulWidget { final String filter; First({Key key, @required this.filter}) : super(key: key); @override FirstState createState() =&gt; FirstState(); }
  • 你要发送什么信息?
  • 我想从主视图(tabview)中的 alertdialog 发送信息(在本例中为字符串)。 AlertDialog 来自主脚手架。我所做的是更新一个字符串并将其发送到选项卡,但我无法刷新选项卡以显示新值

标签: tabs dart flutter appbar flutter-appbar


【解决方案1】:

我通过将父小部件设为 InheritedWidget 找到了解决方案,这样我就可以从子小部件访问它的数据。

这是一个例子:

class MyStatefulWidget extends StatefulWidget{
@override
  MyStatefulWidgetState createState() => MyStatefulWidgetState();

  static MyStatefulWidgetState of(BuildContext context){
    return (context.inheritFromWidgetOfExactType(_MyInheritedStateContainer) as _MyInheritedStateContainer).data;
  }
}
class MyStatefulWidgetState extends State<MyStatefulWidget>{

String variableCalledHello = "Hello World";
@override
  void initState() {
    super.initState();
  }
 @override
  Widget build(BuildContext context) {
   return new _MyInheritedStateContainer(data:this,child:/* Body here */);
  }
}
class _MyInheritedStateContainer extends InheritedWidget{
    _MyInheritedStateContainer({
Key key,
    @required Widget child,
    @required this.data,
  }) : super(key: key, child: child);

final MyStatefulWidgetState data;

 @override
  bool updateShouldNotify(_MyInheritedStateContainer oldWidget) {
    return true;
  }
}

对于每个孩子:

您只需致电MyStatefulWidgetState state = MyStatefulWidgetState.of(context);

例子:

@override
  Widget build(BuildContext context) {
   MyStatefulWidgetState state = MyStatefulWidgetState.of(context);

   print(state.variableCalledHello);

   return /* Container ... */;

}

希望这能帮助某人解决他的问题。

谢谢。

【讨论】:

    猜你喜欢
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多