下面的代码几乎是底部导航栏的官方Ffltter GitHub示例的复制粘贴.问题是,在打开包含视图的小部件时,所有内容都是预加载的.每次我按下底部的栏元素,我都会重新加载所有视图.换句话说,当我按下第一个项目时,日志(log)显示其他项目(第二个和第三个)正在进行网络呼叫.当我按第二个键时,日志(log)显示即使是第一个也在进行网络呼叫.当我调试时,我发现每次我从底栏 Select 一个小部件时,包含它的小部件都会重新构建(有一个对方法build的调用).这是正常行为吗?这是包含小部件的代码

class MainScreen extends StatefulWidget{
    
    @override
      State<StatefulWidget> createState()=> MainScreenState();
    
}


class MainScreenState extends State<MainScreen> with TickerProviderStateMixin{
      GlobalKey<ScaffoldState> scaffoldState = new GlobalKey();
      int _currentSelection = 0;
      BottomNavigationBarType _navigationBarType = BottomNavigationBarType.fixed;
      Li

    st<NavigationIconView> _navigationIcons;


    @override
      void initState() {
       

    super.initState();
        _navigationIcons = <NavigationIconView>[
          new NavigationIconView(
        

    icon: const Icon(Icons.home),
        title: 'Главная',
        vsync: this

      ),
      new NavigationIconView(
        icon: const Icon(Icons.map),
        title: 'Квесты',
        vsync: this
      ),
      new NavigationIconView(
        icon: const Icon(Icons.dehaze),
        title: 'Профиль',
        vsync: this
      )
    ];

    for(NavigationIconView v in _navigationIcons)
      v.controller.addListener(_rebuild);

    _navigationIcons[_currentSelection].controller.value = 1.0;
      }


    @override
      void dispose() {
        for(NavigationIconView v in _navigationIcons)
          v.controller.dispose();
        super.dispose();
    }

     @override
      Widget build(BuildContext context) {
        final BottomNavigationBar botNavBar = new BottomNavigationBar(
          items: _navigationIcons
              .map((NavigationIconView navigationView) => navigationView.item)
              .toList(),
          currentIndex: _currentSelection,
          fixedColor: Colors.green,
          type: _navigationBarType,
          onTap: (int index) {
            setState(() {
              _navigationIcons[_currentSelection].controller.reverse();
              _currentSelection = index;
              _navigationIcons[_currentSelection].controller.forward();
              print('pressed : $_currentSelection');
            });
          },
        );
        return new Scaffold(
          key: scaffoldState,
          body: new  Center(
            key: new Key('Main view container'),
            child: new FutureBuilder<Widget>(
                future: _buildTransitionsStack(),
                builder: (BuildContext context, AsyncSnapshot<Widget> snapshot){
                  if(!snapshot.hasError) return snapshot.data;
                  else{
                    print('sh3t happened in main : ${snapshot.error}');
                  }
                }
            ),
          ),
      bottomNavigationBar: botNavBar,

    );
  }


    Future<Widget> _buildTransitionsStack() {
        final List<FadeTransition> transitions = <FadeTransition>[];
    
        return _showMain().then((mainWidget){
          transitions.add(_navigationIcons[0]
           

    .transition(_navigationBarType,mainWidget, context));
          print('size ${transitions.length}');
        }).then((_){
          transitions.add(_navigationIcons[1].transition(_navigationBarType,
              _showQuest(), context));
    
          transitions.add(_navigationIcons[2].transition(_navigationBarType,
              _showProfile(), context));
    
          transitions.sort((FadeTransition a, FadeTransition b) {
          final Animation<double> aAnimation = a.opacity;
          final Animation<double> bAnimation = b.opacity;
          final double aValue = aAnimation.value;
          final double bValue = bAnimation.value;
          return aValue.compareTo(bValue);
        });
    
          return new Stack(children: transitions);
        });
        }

  Future<Widget> _showMain(){
     return _getToken().then((token){
      return new FeedView(token);
    });
  }

  Widget _showQuest(){
//    return DetailableListScreen(ViewModelType.QUEST);

    return new QuestScreen();

  }

  Widget _showProfile(){
    return new Text('profile');
//    TODO
  }


  void _rebuild() {
    setState(() {

    });
  }

  Future<String> _getToken() async{
    return await SharedPreferences.getInstance()
        .then((SharedPreferences sp)=> sp.getString(TOKEN)
    );
  }
}}

推荐答案

我绝对推荐看@amrnt视频.但是对于那些想要直接答案的人来说,您需要为底部栏部分的每一页实例化PageStorageKey,然后使每一页通过构造函数接收其PageStorageKey.

Dart相关问答推荐

如何防止 Riverpod 的 ConsumerWidget 重建管理 ThemeMode

在Dart中进行系统调用?

Flutter - 可以在没有 Firebase 的情况下使用 Google 登录吗?

如何使用 Dart 分析器从源代码生成 AST 并使用 AST?

错误:非抽象类InternalSelectableMathState

如何在Dart中按布尔对列表进行排序

Flutter url_launcher 未在发布模式下启动 url

Flutter 错误:The _ScaffoldLayout custom multichild layout delegate forgot to lay out the following child

如何在图像内的任意点上旋转图像?

在 TextInputType 更改后控制器重置的 Flutter TextField

如何在 Flutter 中匹配密码和确认密码?

Dart/Flutter 中的=>(箭头)是什么意思?

在 Dart 中编写单元测试的最佳方式是什么?

Dart:打印整数和字符串

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

Dart 中的抽象基类

Dart 中的 Math.round() 在哪里?

如何在 base64 中编码 Dart 字符串?

如何从 Dart 中的列表中获取随机元素?

const 构造函数实际上是如何工作的?