flutter - Flutter - 在构建器内部的开关内调用导航器
问题描述
按下图标后,我想导航到 QrScan 屏幕,但出现错误!
setState() or markNeedsBuild() called during build
我想导航到该屏幕并从 QR 码获取数据,然后我希望这些数据显示在另一个屏幕上!
它说:
这个 Overlay 小部件不能被标记为需要构建,因为框架已经在构建小部件的过程中。仅当其祖先之一当前正在构建时,小部件才能在构建阶段标记为需要构建。这个例外是允许的,因为框架在子组件之前构建父小部件,这意味着将始终构建脏后代。否则,框架可能不会在此构建阶段访问此小部件。
调用 setState() 或 markNeedsBuild() 的小部件是:Overlay- [LabeledGlobalKey#a5a46]
发出违规调用时当前正在构建的小部件是:builder
class MainTabsScreen extends StatefulWidget {
@override
_MainTabsScreenState createState() => _MainTabsScreenState();
}
class _MainTabsScreenState extends State<MainTabsScreen> {
int page = 3;
void _openScanner() {
Navigator.push(context, MaterialPageRoute(builder: (context) => QrScan()));
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Builder(
builder: (context) {
switch (page) {
case 0:
return ExploreScreen();
case 1:
return OffersScreen();
case 2:
_openScanner();
break;
case 3:
return AltersScreen();
case 4:
return ChatsScreen();
default:
return ExploreScreen();
}
},
),
),
bottomNavigationBar: ConvexAppBar(
top: -20.0,
backgroundColor: Colors.white,
activeColor: Color(0xBB0BCC83),
color: Color(0xBB0BCC83),
height: 53.0,
elevation: 0.0,
initialActiveIndex: 3,
items: [
TabItem(
icon: Icons.home,
title: 'Home',
),
TabItem(
icon: Icons.list,
title: 'Offers',
),
TabItem(
icon: Icons.qr_code,
title: 'Scan',
),
TabItem(
icon: Icons.add_alert,
title: 'Notification',
),
TabItem(
icon: Icons.chat,
title: 'Chats',
),
],
onTap: (id) {
setState(() => page = id);
},
),
);
}
}
解决方案
正如评论中所讨论的,一个解决方案是在函数中调用navigator.push
when 。id == 2
onTap
推荐阅读
- excel - excel宏的单元格引用更改
- java - io.fabric8 插件生成 kubernetes 和 openshift yaml
- java - 您可以为 CLI 应用程序运行 JUnit 测试吗?
- excel - Excel 根据时间间隔分组行
- laravel - 可以有别名(=重复条目)的地方的 Laravel 模型 - 如何将它们视为一个
- kamailio - 在 mi_xmlrpc 模块中手动使 Kamailio 崩溃?
- c - OpenACC:如何从指向主机上相应数组的指针中选择设备上的数组
- android - Spinner 选定项的两种方式数据绑定
- erlang - ejabberd:生成自己的进程并将结果路由回客户端
- r - 按照规则集展开数据框