Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 在更改底部导航栏上的选项卡时禁用重建页面_Dart_Flutter - Fatal编程技术网

Dart 在更改底部导航栏上的选项卡时禁用重建页面

Dart 在更改底部导航栏上的选项卡时禁用重建页面,dart,flutter,Dart,Flutter,我习惯于实现底部的导航栏。 这里是我的实现 主飞镖 class MainWidgetState extends State<MainWidget> { @override void initState(){ super.initState(); } int currentTab = 0; final List<Widget> screens = [ MapSample(), Workouts(), Account() ];

我习惯于实现底部的导航栏。 这里是我的实现

主飞镖

class MainWidgetState extends State<MainWidget> {

   @override
  void initState(){
    super.initState();
  }
  int currentTab = 0;

  final List<Widget> screens = [
    MapSample(), Workouts(), Account()
  ];
  Widget currentScreen = MapSample();

  final PageStorageBucket bucket = PageStorageBucket();

  @override
  Widget build(BuildContext ctx) {
    return Scaffold(     
      body: PageStorage(child: currentScreen, bucket: bucket),
      bottomNavigationBar: SizedBox(height: 45,  
        child: bmnav.BottomNav(
        index: currentTab,
        onTap: (i) {
          setState(() {
            currentTab = i;
            currentScreen = screens[i];
          });
        },
        labelStyle: bmnav.LabelStyle(visible: true,  
        items: [
          bmnav.BottomNavItem(OMIcons.map, label: 'Map'),
          bmnav.BottomNavItem(OMIcons.cast, label: 'Workouts'),
          bmnav.BottomNavItem(OMIcons.textsms, label: 'Account'),     
        ],
      ),
      ),  
    );
  }
}
类MainWidgetState扩展状态{
@凌驾
void initState(){
super.initState();
}
int currentTab=0;
最终列表屏幕=[
MapSample()、训练()、帐户()
];
Widget currentScreen=MapSample();
final PageStorageBucket bucket=PageStorageBucket();
@凌驾
小部件构建(BuildContext ctx){
返回脚手架(
正文:页面存储(子项:当前屏幕,存储桶:存储桶),
底部导航栏:大小框(高度:45,
子项:bmnav.BottomNav(
索引:currentTab,
onTap:(一){
设置状态(){
currentTab=i;
currentScreen=屏幕[i];
});
},
labelStyle:bmnav.labelStyle(可见:真,
项目:[
bmnav.BottomNavItem(OMIcons.map,标签:“map”),
bmnav.BottomNavItem(OMIcons.cast,标签:“训练”),
bmnav.BottomNavItem(OMIcons.textsms,标签:'Account'),
],
),
),  
);
}
}
当我从索引屏幕切换到任何其他屏幕并返回索引屏幕时,索引屏幕将始终重建


如果我更改屏幕,我想让屏幕保持活动状态。我该怎么做呢?

您好,我在更改底部导航栏上的选项卡时禁用了重建页面

我还附上了下面的gif:

下面是包含3个选项卡的完整示例,它有自己的变量,可以使用保留值进行更新,并在选项卡更改期间得到验证:

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_demo_app/list.dart';
import 'package:bmnav/bmnav.dart' as bmnav;

MyHomeMapSample valMapSample = null;
MyHomeWorkouts valWorkouts = null;
MyHomeAccount valAccount = null;

MapSample mapSample = null;
Workouts workouts = null;
Account account = null;

Widget currentScreen = null;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    ButtonsLists.context = context;
    currentScreen = MyHomeMapSample();
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();

}



class _MyHomePageState extends State<MyHomePage> {

  @override
  void initState(){
    super.initState();
    debugPrint("currentTab: _MyHomePageState super.initState();");
  }
  int currentTab = 0;

  final PageStorageBucket bucket = PageStorageBucket();

  @override
  Widget build(BuildContext ctx) {
    debugPrint('currentTab: $currentTab');
    return Scaffold(

      body: PageStorage(child: currentScreen, bucket: bucket),
      bottomNavigationBar: SizedBox(height: 58,
        child: bmnav.BottomNav(
          index: currentTab,
          onTap: (i) {
            setState(() {
              currentTab = i;
              currentScreen = getWidget(context, i);
              debugPrint('inner currentTab: $currentTab');
              debugPrint('inner currentScreen: $currentScreen');
            });
          },
          labelStyle: bmnav.LabelStyle(visible: true),
          items: [
            bmnav.BottomNavItem(Icons.map, label: 'Map'),
            bmnav.BottomNavItem(Icons.cast, label: 'Workouts'),
            bmnav.BottomNavItem(Icons.textsms, label: 'Account'),
          ],
        ),
      ),
      resizeToAvoidBottomPadding: true,
    );
  }

  Widget getWidget(BuildContext context, int i){
    if(i==0){
      if(valMapSample == null){
        valMapSample = MyHomeMapSample();
        mapSample = valMapSample.createState();
        return valMapSample;
      }else{
        return mapSample.build(context);
      }
    }

    else if(i==1){
      if(valWorkouts == null){
        valWorkouts = MyHomeWorkouts();
        workouts = valWorkouts.createState();
        return valWorkouts;
      }else{
        return workouts.build(context);
      }

    }else if(i==2){
      if(valAccount == null){
        valAccount = MyHomeAccount();
        account = valAccount.createState();
        return valAccount;
      }else{
        return account.build(context);
      }
    }
  }

}



class MyHomeMapSample extends StatefulWidget {
  MyHomeMapSample({Key key}) : super(key: key);
  @override
  MapSample createState() => MapSample();
}

class MapSample extends State<MyHomeMapSample> with AutomaticKeepAliveClientMixin {
  var myVariable = 0;

  @override
  void initState(){
    super.initState();
    debugPrint('current: MapSample: initState() called!');
  }

  @override
  Widget build(BuildContext context) {
    myVariable = myVariable + 1;
    return Scaffold(
      appBar: AppBar(
        title: Text('MapSample'),
      ),
      body: Center(
        child: Text('MapSample details + $myVariable'),
      ),
      resizeToAvoidBottomPadding: true,
    );
  }

  @override
  // TODO: implement wantKeepAlive
  bool get wantKeepAlive => true;

}



class MyHomeWorkouts extends StatefulWidget {
  MyHomeWorkouts({Key key}) : super(key: key);
  @override
  Workouts createState() => Workouts();
}

class Workouts extends State<MyHomeWorkouts> with AutomaticKeepAliveClientMixin {
  var myVariable = 0;

  @override
  void initState(){
    super.initState();
    debugPrint('current: Workouts: initState() called!');
  }

  @override
  Widget build(BuildContext context) {
    myVariable = myVariable + 1;
    return Scaffold(
      appBar: AppBar(
        title: Text('Workouts'),
      ),
      body: Center(
        child: Text('Workouts details + $myVariable'),
      ),
      resizeToAvoidBottomPadding: true,
    );
  }

  @override
  // TODO: implement wantKeepAlive
  bool get wantKeepAlive => true;

}




class MyHomeAccount extends StatefulWidget {
  MyHomeAccount({Key key}) : super(key: key);
  @override
  Account createState() => Account();
}

class Account extends State<MyHomeAccount> with AutomaticKeepAliveClientMixin {
  var myVariable = 0;

  @override
  void initState(){
    super.initState();
    debugPrint('current: Account: initState() called!');
  }

  @override
  Widget build(BuildContext context) {
    myVariable = myVariable + 1;
    return Scaffold(
      appBar: AppBar(
        title: Text('Account'),
      ),
      body: Center(
        child: Text('Account details + $myVariable'),
      ),
      resizeToAvoidBottomPadding: true,
    );
  }

  @override
  // TODO: implement wantKeepAlive
  bool get wantKeepAlive => true;

}
导入“包装:颤振/材料.省道”;
进口“包装:颤振/基础.dart”;
导入“package:flatter_demo_app/list.dart”;
导入“包:bmnav/bmnav.dart”作为bmnav;
MyHomeMapSample valMapSample=null;
MyHomeWorkouts valWorkouts=null;
MyHomeAccount valAccount=null;
MapSample MapSample=null;
训练训练=空;
账户=空;
窗口小部件currentScreen=null;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
ButtonsLists.context=上下文;
currentScreen=MyHomeMapSample();
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
void initState(){
super.initState();
debugPrint(“currentTab:_myHomePageStatesuper.initState();”;
}
int currentTab=0;
final PageStorageBucket bucket=PageStorageBucket();
@凌驾
小部件构建(BuildContext ctx){
debugPrint('currentTab:$currentTab');
返回脚手架(
正文:页面存储(子项:当前屏幕,存储桶:存储桶),
底部导航栏:大小框(高度:58,
子项:bmnav.BottomNav(
索引:currentTab,
onTap:(一){
设置状态(){
currentTab=i;
currentScreen=getWidget(上下文,i);
debugPrint('internalcurrenttab:$currentTab');
debugPrint('internalcurrentscreen:$currentScreen');
});
},
labelStyle:bmnav.labelStyle(可见:真),
项目:[
bmnav.BottomNavItem(Icons.map,标签:“map”),
bmnav.BottomNavItem(Icons.cast,标签:“训练”),
bmnav.BottomNavItem(Icons.textsms,标签:“Account”),
],
),
),
resizeToAvoidBottomPadding:true,
);
}
Widget getWidget(BuildContext上下文,inti){
如果(i==0){
if(valMapSample==null){
valMapSample=MyHomeMapSample();
mapSample=valMapSample.createState();
返回valMapSample;
}否则{
返回mapSample.build(上下文);
}
}
else如果(i==1){
如果(valWorkouts==null){
valWorkouts=MyHomeWorkouts();
workouts=valWorkouts.createState();
返回训练;
}否则{
返回训练。构建(上下文);
}
}else如果(i==2){
if(valAccount==null){
valAccount=MyHomeAccount();
account=valAccount.createState();
返回帐户;
}否则{
返回account.build(上下文);
}
}
}
}
类MyHomeMapSample扩展StatefulWidget{
MyHomeMapSample({Key}):超级(Key:Key);
@凌驾
MapSample createState()=>MapSample();
}
类MapSample使用AutomaticEpaLiveClientMixin扩展状态{
var-myVariable=0;
@凌驾
void initState(){
super.initState();
debugPrint('current:MapSample:initState()调用!');
}
@凌驾
小部件构建(构建上下文){
myVariable=myVariable+1;
返回脚手架(
appBar:appBar(
标题:文本(“MapSample”),
),
正文:中(
子项:文本('MapSample details+$myVariable'),
),
resizeToAvoidBottomPadding:true,
);
}
@凌驾
//TODO:实现wantKeepAlive
bool get wantKeepAlive=>true;
}
类MyHomeWorkouts扩展StatefulWidget{
MyHomeWorkouts({Key}):超级(Key:Key);
@凌驾
训练createState()=>训练();
}
课堂训练通过AutomaticEpaLiveClientMixin扩展状态{
var-myVariable=0;
@凌驾
void initState(){
super.initState();
debugPrint('current:Workouts:initState()调用!');
}
@凌驾
小部件构建(构建上下文){
myVariable=myVariable+1;
返回脚手架(
appBar:appBar(
标题:文本(“训练”),
),
正文:中(
子项:文本('Workouts details+$myVariable'),
),
resizeToAvoidBottomPadding:true,
);
}
@凌驾
//TODO:实现wa