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