首页 > 解决方案 > Flutter 获取从 Navigator.pop() 返回到 Drawer 的数据

问题描述

我有我的应用程序的主/主页小部件,我们称之为home.dart

在这个小部件中,我在我的Scaffold小部件中定义了抽屉键。该Drawer对象的代码在一个单独的文件中,navdrawer.dart.

主页.dart

import 'navdrawer.dart';
. . .
@override
  Widget build(BuildContext context) {
    return Scaffold(
      drawer: NavDrawer(),
      ...

现在在里面NavDrawer,我构建了我的Drawer小部件,它有一个设置按钮,它链接到settings.dart屏幕。

我喜欢这样:

导航抽屉.dart

. . .
InkWell(
              onTap: () async {
                final result = await Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => Settings()),
                );
                print(result);
              },
              child: ListTile(
                  leading: Icon(
                    Icons.settings,
                    color: AppTextColor,
                  ),
                  title: Text('Settings'))),

所以现在,当用户在设置页面上按下返回按钮时,Navigator.pop()调用会将我需要的数据返回resultnavdrawer.dart.

但我的问题是......如何将这些数据获取到我的home.dart屏幕/状态?

标签: flutter

解决方案


我建议您为此使用provider,scoped_model或其他状态管理技术。最简单(但也是毫无价值)的解决方案是使用全局变量。

但是,有一个中间立场。为简单起见,我使用dynamic的结果类型,您最好知道Settings返回的是什么,因此请改用该类型。

你的home.dart档案

class _HomePageState extends State<HomePage> {
  dynamic _result; // Create a variable. 

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      drawer: NavDrawer(
        onResult: (result) {
          _result = result; // <-- This is your result. 
        }
      ),
    );
  }
}

在您的中添加以下内容navdrawer.dart

class NavDrawer extends StatelessWidget {

  // Add these two lines. 
  final ValueChanged onResult; 
  NavDrawer({this.onResult}); 

  // Other code ...

} 

修改文件onTap内的方法navdrawer.dart

onTap: () async {
  final result = await Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => Settings()),
  );
  onResult(result); // <-- Add this line. 
}   

推荐阅读