Flutter - 在构建器内部的开关中调用 Navigator
Flutter - call Navigator inside switch which it is inside builder
我想在按下图标后导航到 QrScan 屏幕,但出现错误!!
setState() or markNeedsBuild() called during build
我想导航到该屏幕并从二维码获取数据,之后我希望这些数据显示在另一个屏幕上!
它说:
无法将此叠加小部件标记为需要构建,因为框架已经在构建小部件的过程中。
仅当其祖先之一当前正在构建时,才可以在构建阶段将小部件标记为需要构建。
这个例外是允许的,因为框架在子部件之前构建父部件,这意味着总是会构建一个脏的后代部件。
否则,框架可能不会在此构建阶段访问此小部件。
调用 setState() 或 markNeedsBuild() 的小部件是:
覆盖- [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);
},
),
);
}
}
正如评论中所讨论的,解决方案是在 onTap
函数中 id == 2
时调用 navigator.push
。
我想在按下图标后导航到 QrScan 屏幕,但出现错误!!
setState() or markNeedsBuild() called during build
我想导航到该屏幕并从二维码获取数据,之后我希望这些数据显示在另一个屏幕上!
它说:
无法将此叠加小部件标记为需要构建,因为框架已经在构建小部件的过程中。 仅当其祖先之一当前正在构建时,才可以在构建阶段将小部件标记为需要构建。 这个例外是允许的,因为框架在子部件之前构建父部件,这意味着总是会构建一个脏的后代部件。 否则,框架可能不会在此构建阶段访问此小部件。
调用 setState() 或 markNeedsBuild() 的小部件是: 覆盖- [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);
},
),
);
}
}
正如评论中所讨论的,解决方案是在 onTap
函数中 id == 2
时调用 navigator.push
。