我有一个主dart类,应用程序栏位于其中,应用程序栏包含一个刷新按钮.我正在使用导航抽屉填充另外两个视图f1和f2.

如何将刷新按钮单击从我的main.dart传递给子片段种类f1.dart,以便我可以刷新f1.dart上的内容

// State of Main
class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      drawer: Drawer(
        child: new Column(
          children: <Widget>[

////////////////////////////////////////////////////////////
                new FirstFragment(),
                new SecondFragment()
/////////////////////////////////////////////////////////////
          ],
        ),
      ),
      appBar: AppBar(
        title: Text(widget.title),
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.refresh),
            onPressed: () {
              print("refresh pressed");
/////////////////////////
         How to send this refresh pressed event to my FirstFragment class??
/////////////////////////
            },
            color: Colors.white,
          )
        ],
      ),
      body: _getDrawerItemWidget(_selectedDrawerIndex),
    );
  }

}

在安卓系统中,我一直在使用事件监听器,而在iOS系统中,我可以使用委托.我如何在Flutter /dart 上实现这一点?

推荐答案

您可以传递一个回调,使用VoidCallback并在您的主小部件上接收事件.

        class MainPage extends StatelessWidget {
          _onTapButton() {
            print("your event here");
          }

          @override
          Widget build(BuildContext context) {
            return Container(
              child: ChildPage(
                onTap: _onTapButton,
              ),
            );
          }
        }

        class ChildPage extends StatelessWidget {
          final VoidCallback onTap;

          const ChildPage({Key key, this.onTap}) : super(key: key);

          @override
          Widget build(BuildContext context) {
            return Container(
              child: RaisedButton(
                child: Text("Click Me"),
                onPressed: () {
                  //call to your callback  here
                  onTap();
                },
              ),
            );
          }
        } 

如果您想要相反的结果,只需刷新父窗口小部件的状态并更改传递给片段的参数,或者也可以使用GlobalKey,如下例所示:

        class MainPage extends StatelessWidget {

          final GlobalKey<ChildPageState> _key = GlobalKey();

          _onTapButton() {
            _key.currentState.myMethod();
          }

          @override
          Widget build(BuildContext context) {
            return Container(
              child: Column(
                children: [
                  ChildPage(
                    key: _key,
                  ),
                  RaisedButton(
                    child: Text("Click me"),
                    onPressed: _onTapButton,
                  )
                ],
              )
            );
          }
        }

        class ChildPage extends StatefulWidget {
          const ChildPage({Key key}) : super(key: key);

          @override
          ChildPageState createState() {
            return new ChildPageState();
          }
        }

        class ChildPageState extends State<ChildPage> {

          myMethod(){
            print("called from parent");
          }

          @override
          Widget build(BuildContext context) {
            return Container(
              child: Text("Click Me"),
            );
          }
        }

Dart相关问答推荐

我们应该将多少代码放入构造函数中?

如何找到这个Currate函数的返回类型?

Flutter - MultiProvider 如何与相同类型的提供者一起工作?

如何在 Dart 中实现继承?

Dart 包对 git repo 子目录的依赖

Flutter 使用拖动和按钮单击扩展 TextField

如何在 ListView 中添加额外的底部间距?

Flutter - 如何自动启用 AnimatedOpacity?

Flutter:[cloud_firestore/unknown] NoSuchMethodError:null 上的无效成员:'includeMetadataChanges'(Flutter Web)

Dart VM 的性能与 Node.js 相比如何?

如何在DartPad中导入库?

如何判断一个字符串是否可以是 json.decode

如何在Flatter dart中使用相同的元素初始化列表?

Flutter类继承

Dart 中 http 和 HttpClient 的区别

dart和下划线

Dart:如何判断变量类型是否为字符串

轻松判断数字是否在 Dart 的给定范围内?

Dart中var和dynamic类型的区别?

Dart 空值判断习惯用法或最佳实践是什么?