كيفية إصلاح استثناء flutter: تم طلب عملية المستكشف مع سياق لا يتضمن المستكشف

0

أحاول إنشاء تنقل درج باستخدام إطار رفرفة ، لكنني أحصل على الاستثناء التالي في كل مرة أقوم بتشغيله

Another exception was thrown: Navigator operation requested with a context that does not include a Navigator.

فما هو الحل ، أي مساعدة؟

لقد استخدمت فئة المستكشف على النحو التالي

void main() {
  runApp(new MyApp());
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return new AppStates();
  }
}

class AppStates extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build

    return MaterialApp(
      home: new Scaffold(
        appBar: AppBar(
          title: Text("Application App Bar"),
        ),
        drawer: Drawer(
          child: ListView(
            children: <Widget>[
              ListTile(
                title: Text("Next Page"),
                onTap: () {
                  Navigator.push(context,
                      MaterialPageRoute(builder: (context) => NextPage()));
                },
              )
            ],
          ),
        ),
      ),
    );
  }
}

ورمز فئة NextPage هو

class NextPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text("Next Page App Bar"),
        ),
      ),
    );
  }
}

2 الاجابة

0

هذا لأن context الذي تستخدمه هو من مستوى التطبيق قبل Navigator تم إنشاؤه بالفعل. هذه مشكلة شائعة عند إنشاء تطبيقات ملف واحد "بسيطة" في Flutter.

هناك عدد من الحلول الممكنة. واحد هو استخراج الخاص بك Drawer في فئتها الخاصة (تمديد Stateless/StatefulWidget وفقا لذلك) ، ثم في ذلك build تجاوز الوالد Scaffold سيتم بالفعل إنشاء تحتوي على Navigator لتستخدمها.

class MyDrawer extend StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Drawer(
      child: ListView(
        children: <Widget>[
          ListTile(
            title: Text("Next Page"),
            onTap: () {
              Navigator.push(context,
                  MaterialPageRoute(builder: (context) => NextPage()));
            },
          )
        ],
      ),
    );
  }

والآخر ، إذا كنت تريد الاحتفاظ بهذا Drawer في نفس الملف ، هو استخدام أ Builder بدلاً من ذلك ، والذي له نفس التأثير:

    drawer: Builder(builder: (context) =>
      Drawer(
        child: ListView(
          children: <Widget>[
            ListTile(
              title: Text("Next Page"),
              onTap: () {
                Navigator.push(context,
                    MaterialPageRoute(builder: (context) => NextPage()));
              },
            )
          ],
        ),
      ),
    ),
:مؤلف
0

يبدو أنه ليس لديك إعداد Navigator للسياق الحالي. بدلاً من استخدام StatefulWidget ، يجب عليك تجربة MaterialApp باعتباره تطبيق الجذر الخاص بك. يدير MaterialApp المستكشف من أجلك. فيما يلي مثال على كيفية إعداد تطبيق في main.dart الخاص بك

void main() {
 runApp(MaterialApp(
   title: 'Navigation Basics',
   home: MyApp(),
 ));
}
:مؤلف
فوق
قائمة طعام