代码之家  ›  专栏  ›  技术社区  ›  Garrett

抽屉中的“颤振”按钮在点击时出错,而不是导航到正确的页面

  •  0
  • Garrett  · 技术社区  · 7 年前

    我正在尝试在抽屉中放置一些按钮,用户可以在上面加上这些按钮,并将其带到另一个页面/小部件。然而,它给了我一个错误,不起作用。我真的不确定这个问题在考虑什么,我正在另一个项目中这样做,而且它是有效的,此外,我还查看了颤振文档上的食谱,了解如何进行导航,基于此,它看起来也不错。

    这是我抽屉里的密码 Scaffold 小装置:

    Drawer(
        child: Column(
            children: <Widget>[
                AppBar(
                    automaticallyImplyLeading: false,
                    title: Text('Looped In'),
                ),
                ListTile(
                    leading: Icon(Icons.info),
                    title: Text('About'),
                    onTap: () {
                        Navigator.of(context).pushNamed('/about');
                    },
                ),
            ],
        ),
    ),
    

    这是我得到的错误回溯

    flutter: The following assertion was thrown while handling a gesture:
    flutter: Navigator operation requested with a context that does not include a Navigator.
    flutter: The context used to push or pop routes from the Navigator must be that of a widget that is a
    flutter: descendant of a Navigator widget.
    flutter:
    flutter: When the exception was thrown, this was the stack:
    flutter: #0      Navigator.of.<anonymous closure> (package:flutter/src/widgets/navigator.dart:1273:9)
    flutter: #1      Navigator.of (package:flutter/src/widgets/navigator.dart:1280:6)
    flutter: #2      MyAppState.build.<anonymous closure> (file:///Users/garrettlove/Documents/learn/Flutter/loopt_in/lib/main.dart:59:29)
    flutter: #3      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:507:14)
    flutter: #4      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:562:30)
    flutter: #5      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
    flutter: #6      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:242:9)
    flutter: #7      TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:204:7)
    flutter: #8      GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
    flutter: #9      _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:147:20)
    flutter: #10     _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:121:22)
    flutter: #11     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:101:7)
    flutter: #12     _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:64:7)
    flutter: #13     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:48:7)
    flutter: #14     _invoke1 (dart:ui/hooks.dart:153:13)
    flutter: #15     _dispatchPointerDataPacket (dart:ui/hooks.dart:107:5)
    flutter:
    flutter: Handler: onTap
    flutter: Recognizer:
    flutter:   TapGestureRecognizer#2d408(debugOwner: GestureDetector, state: ready, won arena, finalPosition:
    flutter:   Offset(98.5, 222.5), sent tap down)
    

    编辑 以下是我所拥有的一切:

    import 'package:flutter/material.dart';
    
    import './pages/home.dart';
    import './pages/categories.dart';
    import './pages/about.dart';
    import './pages/contact.dart';
    
    void main() => runApp(new MyApp());
    
    class MyApp extends StatefulWidget {
      @override
      State<StatefulWidget> createState() {
        return MyAppState();
      }
    }
    
    class MyAppState extends State<MyApp> {
      int _selectedTab = 0;
      final _pageOptions = [
        HomePage(),
        CatPage(),
      ];
    
      Widget _buildDrawer(BuildContext context) {
        return Drawer(
          child: Column(
            children: <Widget>[
              AppBar(
                automaticallyImplyLeading: false,
                backgroundColor: Color.fromRGBO(135, 142, 136, 1.0),
                title: Text('Looped In'),
              ),
              ListTile(
                leading: Icon(Icons.info, color: Color.fromRGBO(247, 203, 21, 1.0),),
                title: Text('About'),
                onTap: () {
                  //Navigator.of(context).pushNamed('/about');
                  Navigator.of(context).push(MaterialPageRoute(builder: (context) => AboutPage()));
                },
              ),
            ],
          ),
        );
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          theme: ThemeData(
            accentColor: Color.fromRGBO(245, 93, 62, 1.0),
            primaryTextTheme: TextTheme(
              title: TextStyle(color: Colors.white),
            ),
          ),
          routes: <String, WidgetBuilder>{
            '/home': (BuildContext context) => HomePage(),
            '/about': (BuildContext context) => AboutPage(),
            '/contact': (BuildContext context) => ContactPage(),
          },
          home: Scaffold(
            drawer: _buildDrawer(context),
            appBar: AppBar(
              title: Text('Looped In'),
              backgroundColor: Color.fromRGBO(
                135,
                142,
                136,
                1.0,
              ),
            ),
            body: Container(
              padding: EdgeInsets.symmetric(horizontal: 10.0),
              child: _pageOptions[_selectedTab],
            ),
            bottomNavigationBar: BottomNavigationBar(
              currentIndex: _selectedTab,
              onTap: (int index) {
                setState(() {
                  _selectedTab = index;
                });
              },
              fixedColor: Color.fromRGBO(118, 190, 208, 1.0),
              items: [
                BottomNavigationBarItem(
                  icon: Icon(Icons.home),
                  title: Text('Everything'),
                ),
                BottomNavigationBarItem(
                  icon: Icon(Icons.category),
                  title: Text('Categories'),
                ),
              ],
            ),
          ),
        );
      }
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Thanthu    7 年前

    你需要确保 context 你用来 Navigator 他有父母 MaterialApp 否则就会发生这个错误。包装你的 Scaffold 小部件 材料聚丙烯 应该解决这个问题。

    也在你的 材料聚丙烯 确保提供 route 参数与路线匹配 '/about'

    应该是这样的:

        MaterialApp(
          routes: <String, WidgetBuilder>{
            '/about': (BuildContext context) => AboutPage()
          },
          home: Scaffold(),
        );
    

    编辑:

    下面你可以根据你的代码找到解决方案。我测试过了,效果很好。你所要做的就是把衣服包起来 断头台 具有 Builder 如下图所示:

    home: Builder(
            builder:  (context) => Scaffold(
              drawer: _buildDrawer(context),
              appBar: AppBar(
                title: Text('Looped In'),
                backgroundColor: Color.fromRGBO(
                  135,
                  142,
                  136,
                  1.0,
                ),
              ),
    
        2
  •  0
  •   Victor Tong    7 年前

    在构建小部件之前,您可能需要在“关于”屏幕中输入一个字符串

    static const String routeName = "/about";
    

    还是直接用这个

    onPressed: () {
                      Navigator.of(context).push(MaterialPageRoute(
                          builder: (context) => new AboutScreen()));
                    }
    
        3
  •  0
  •   Asif Akhtar98    4 年前

    如果您正在使用Getx的GetMaterial应用程序并使用Get Routes。然后在get routes中指定所有路由,否则将在控制台中发生此错误(在非空运算符中使用空检查),屏幕导航将不起作用。