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