带有底部导航栏的页面之间的数据传递

时间:2019-01-18 09:47:12

标签: dart flutter

我有一个应用程序,该应用程序在登录后会路由到“ mainapp”页面。该应用程序包含一个底部导航栏,该导航栏显示相应的已按下图标的页面。我想将Map<String, dynamic>类型的数据传递到这些页面,但是遇到了麻烦。此映射是通过一个函数生成的,该函数从服务器获取数据,将其保存到共享首选项,然后加载共享首选项并将其作为映射返回(所有都包含在getData()中)。我想传递此地图,这样就不必每次都加载共享的首选项,但是也会在需要时与共享的首选项一起更新此地图(可能在其中一个页面上执行操作)。

class MainApp extends StatefulWidget {
  @override
  _MainAppState createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {


  Map<String, dynamic> Data;


  StartFunc() async {
   Data = await getData();
   setState(() {}); 
 }


  @override
  void initState() {
    StartFunc();
    super.initState();
  }

  var _pages = [
    PageOne(Data:Data),
    PageTwo(),
    PageThree(),
   PageFour(),
   PageFive(),
  ];

  int _currentIndex = 0;

  onTabTapped(int index) {
    setState(() {
      _currentIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    return _currentIndex == 2
        ? PageTwo()
        : Scaffold(
      body: _pages[_currentIndex],
      bottomNavigationBar: BottomNavigationBar(
        type: BottomNavigationBarType.fixed,
        items: [
          BottomNavigationBarItem(
              icon: Icon(Icons.library_books), title: Text('')),
          BottomNavigationBarItem(
              icon: Icon(Icons.notifications), title: Text('')),
          BottomNavigationBarItem(
              icon: Icon(Icons.add_circle_outline), title: Text('')),
          BottomNavigationBarItem(
              icon: Icon(Icons.mail), title: Text('')),
          BottomNavigationBarItem(
              icon: Icon(Icons.person), title: Text('')),
        ],
        onTap: onTabTapped,
        currentIndex: _currentIndex,
      ),
    );
  }
}

我收到一条错误消息,说初始化器中只能访问静态成员。我想知道继承的窗口小部件或其他设计模式(例如范围模型和BLoC)是否可以帮助您,但不确定这是否是正确的方法。我也不确定在这种情况下如何开始实施它们。

1 个答案:

答案 0 :(得分:5)

您的代码中有两个问题:

  1. holder.approveCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { Logger.infoLog("Checked Position ==> "+position+" boolean ==> "+b); } }); 的正文中使用异步方法 有关详情,请参见here

  2. 在初始化程序中使用实例数据 有关详情,请参见here

接下来的工作是对您的代码进行非常基本的重写,而进行的校正最少。

数据映射是从模拟的后端加载的,在initState()内部进行更新,并在onTap回调的PageOne中打印到控制台。

请注意,我已将实例变量PageTwo更改为Data以符合Effective Dart准则。

请注意,要点不能正确地解决具有共享首选项的后端服务的同步:这可能是最终产品中必须解决的问题。

我刚刚评论了使您的代码有效的必要条件: 如果系统的复杂性以及与外部API的关系开始增长,那么可能值得考虑使用Bloc架构。

data