gpt4 book ai didi

dart - 在更改 BottomNavigationBar 上的选项卡时禁用重建页面

转载 作者:IT王子 更新时间:2023-10-29 06:57:20 27 4
gpt4 key购买 nike

我用了bmnav到底部导航栏的实现。这是我的实现。

主.dart

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'),
],
),
),
);
}
}

当我从索引屏幕切换到任何其他屏幕并返回索引屏幕时,索引屏幕将始终重建。

如果我更换屏幕,我希望让我的屏幕保持事件状态。我该怎么做?

最佳答案

您好,我已经实现了在更改 BottomNavigationBar 上的选项卡时禁用重建页面。

我还在下面附上了gif:

enter image description here

下面是带有 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;

}

我所做的是全局创建“StatefulWidget”和“State<>”类对象,然后借助“createState()”的“StatefulWidget”方法和“.build(context)”的方法“State<>” 类,我已经阻止调用“initState()”方法并在没有它的情况下更新小部件。此外,我将“with AutomaticKeepAliveClientMixin”用于“State<>”,这将尝试使对象保持事件状态。

希望这会有所帮助:)

关于dart - 在更改 BottomNavigationBar 上的选项卡时禁用重建页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55781317/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com