【发布时间】:2018-09-12 15:24:42
【问题描述】:
我想要实现功能,当用户点击BottomNavigationBarItem 弹出到根目录时,如果当前页面索引等于像普通 iOS 应用程序那样点击的索引。
我尝试如下。我在MaterialApp 和HomeScreen 中设置所有根页面路由,如果currentIndex 等于index,popUntil 到根页面。
但是错误说
flutter:处理手势时引发以下 StateError:
颤振:坏状态:未来已经完成
我怎样才能做到这一点?
代码:
// MyApp class
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
routes: <String, WidgetBuilder>{
'/Page1': (BuildContext context) => new Page1(),
'/Page2': (BuildContext context) => new Page2(),
'/Page3': (BuildContext context) => new Page3(),
'/Page4': (BuildContext context) => new Page4(),
},
title: 'Flutter Example',
home: new HomeScreen(),
);
}
}
// MyHome class
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => new _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
final List<StatelessWidget> pages = [
new Page1(),
new Page2(),
new Page3(),
new Page3(),
];
final List<String> routes = [
'/Page1',
'/Page2',
'/Page3',
'/Page4',
];
int currentIndex = 0;
@override
Widget build(BuildContext context) {
return new WillPopScope(
onWillPop: () => new Future<bool>.value(true),
child: new CupertinoTabScaffold(
tabBar: new CupertinoTabBar(
onTap: (index) {
if (index == currentIndex) {
Navigator.popUntil(context, ModalRoute.withName(routes[index]));
}
currentIndex = index;
},
backgroundColor: Colors.white,
activeColor: Colors.blue,
inactiveColor: Colors.grey,
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(Icons.looks_one),
title: Text('Page1'),
),
BottomNavigationBarItem(
icon: Icon(Icons.looks_two),
title: Text('Page2'),
),
BottomNavigationBarItem(
icon: Icon(Icons.looks_3),
title: Text('Page3'),
),
BottomNavigationBarItem(
icon: Icon(Icons.looks_4),
title: Text('Page4'),
),
],
),
tabBuilder: (BuildContext context, int index) {
return new DefaultTextStyle(
style: const TextStyle(
fontFamily: '.SF UI Text',
fontSize: 17.0,
color: CupertinoColors.black,
),
child: new CupertinoTabView(
builder: (BuildContext context) {
return pages[index];
},
),
);
},
),
);
}
}
【问题讨论】:
-
如果您将
onWillPop更改为async () => true会怎样? -
我都做了,但结果相同。我在做你的意思吗?
onWillPop: () async { new Future<bool>.value(true); // return true; } -
我用这个运行你的代码:
return new WillPopScope( onWillPop: () async { return await Future<bool>.value(true); },没有收到任何错误。 -
你确定吗?点击相同的索引后,仍然会黑屏。
标签: flutter