我一定在这里度过了一段金发碧眼的时刻;我想做的事情很简单,但我无法弄清楚。
我有一个
BottomNavigationBar
,它可以很好地导航到不同的页面,但底部栏始终将第一个项目显示为当前项目,它始终是突出显示的项目。
我正在使用
setState
来更改 currentIndex
,我可以看到正在发生这种情况,但底部栏永远不会改变。
这是代码:
import 'package:flutter/material.dart';
import 'package:myfestival/models/app_config_model.dart';
import 'package:myfestival/pages/user_mode/menus/user_app_named_routes.dart';
class BottomMenu extends StatefulWidget {
const BottomMenu({super.key, required this.menus});
final List<AppMenu> menus;
@override
State<BottomMenu> createState() => _BottomMenuState();
}
class _BottomMenuState extends State<BottomMenu> {
int? currentIndex;
@override
Widget build(BuildContext context) {
print('current index is $currentIndex');
return BottomNavigationBar(
type: BottomNavigationBarType.fixed,
currentIndex: currentIndex??0,
items: [
for (final menu in widget.menus.take(5))
BottomNavigationBarItem(
icon: menu.smallIcon,
label: menu.title,
),
],
onTap: (value) {
setState(() {currentIndex = value;});
UserAppRouter.navigateToMenu(context, widget.menus[value]);
},
);
}
}
这是单击不同底部按钮的输出(我有 3 个):
current index is null
current index is 2
current index is null
current index is 1
current index is null
current index is 2
current index is null
current index is 0
current index is null
current index is 1
current index is null
current index is 2
但底部栏看起来与此没有什么不同:
(即第一项始终是选定的)
null
打印是一个赠品,可能每次调用导航时,您都没有传递所选当前索引的参数,因此,绘制小部件时它始终是未定义的。
一种解决方案可能是在每次调用小部件时强制使用 currentIndex 并将其用作参数。
另一种方法是创建一个全局变量来存储
currentIndex
并确保小部件在构建调用时读取。