简体   繁体   English

在有状态小部件中按路线名称进行颤动导航

[英]Flutter navigation by route name in statefull widget

i am trying to go on another page using navigation, but i am getting error;我正在尝试使用导航进入另一个页面,但出现错误;

Navigator operation requested with a context that does not include a Navigator.使用不包含导航器的上下文请求导航器操作。

i am just trying to move on next page, i followed flutter documentations for this stateless widget but how to do with state full widget.我只是想继续下一页,我遵循了这个无状态小部件的颤振文档,但如何处理状态完整的小部件。

import 'package:flutter/material.dart';

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

class MyApp extends StatefulWidget {
  @override
  State createState() => new MyApp1();
}

class MyApp1 extends State<MyApp> {
  List<Widget> _listSection = [];

  Widget build(BuildContext context) {
   return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Share IDEASS',
      initialRoute: '/',
  routes: {
    '/second': (context) => SecondScreen(),
  },
      home: Scaffold(
        appBar: AppBar(
          title: Text('IDEAS'),
        ),
        body: Container(
          child: Stack(
            children: [
              floatingButton(),
            ],
          ),
        ),
      ),
    );
  }



  Widget floatingButton() {
    return Container(
      padding: const EdgeInsets.all(30),
      alignment: Alignment.bottomRight,
      child: FloatingActionButton(
        onPressed: () {
            Navigator.pushNamed(context, "/SecondScreen");
          },
        child: Text("+"),
        backgroundColor: Colors.blue,
      ),
    );
  }
}
class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Route"),
      ),
      body: Center(
        child: RaisedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text('Go back!'),
        ),
      ),
    );
  }
}

You should use the named route you created.您应该使用您创建的命名路由。

Widget floatingButton(BuildContext context) { // added context as a parameter
    return Container(
      padding: const EdgeInsets.all(30),
      alignment: Alignment.bottomRight,
      child: FloatingActionButton(
        onPressed: () {
            Navigator.pushNamed(context, "/second"); // Changed this to use the named route
          },
        child: Text("+"),
        backgroundColor: Colors.blue,
      ),
    );
  }
}

then use the following然后使用以下

body: Container(
          child: Stack(
            children: [
              floatingButton(context),
            ],
          ),
        ),

The situation here is that the floatingButton() uses a context with the navigator to push the given page route.这里的情况是floatingButton()使用带有导航器的上下文来推送给定的页面路由。 But the context used is provided in the parent Widget( MaterialApp ) it self, which doesn't include a Navigator, hence the error.但是使用的上下文是在它自己的父 Widget( MaterialApp ) 中提供的,它不包含 Navigator,因此是错误的。

So, Try this approach: Separate the Home widget from the MaterialApp, like below:因此,尝试这种方法:将 Home 小部件与 MaterialApp 分开,如下所示:

return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Share IDEASS',
      initialRoute: '/',
      routes: {
        '/second': (context) => SecondScreen(),
      },
      home: HomePage(),
    );

Create a stateless widget containing the Scaffold:创建一个包含 Scaffold 的无状态小部件:

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('IDEAS'),
      ),
      body: Container(
        child: Stack(
          children: [
            floatingButton(),
          ],
        ),
      ),
    );
  }
}

Hope it helps.希望能帮助到你。 Let me know if this doesn't work.如果这不起作用,请告诉我。

You have made two mistakes because of which your code is not working:您犯了两个错误,因此您的代码无法正常工作:

  1. You have used wrong route name.您使用了错误的路线名称。 Replace /SecondScreen with /second用 /second 替换 /SecondScreen
  2. You have used wrong context.您使用了错误的上下文。 You can get Navigator only if your widget has MaterialApp as it's parent and here you are using context of MyApp1 so it is not working.仅当您的小部件具有 MaterialApp 作为其父级时,您才能获得 Navigator,并且在这里您使用的是 MyApp1 的上下文,因此它无法正常工作。

Following is a working code for your reference.以下是供您参考的工作代码。


import 'package:flutter/material.dart';

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

class MyApp extends StatefulWidget {
  @override
  State createState() => new MyApp1();
}

class MyApp1 extends State<MyApp> {
  List<Widget> _listSection = [];

  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Share IDEASS',
      initialRoute: '/',
      routes: {
        '/second': (context) => SecondScreen(),
      },
      home: AppContent(),
    );
  }
}

class AppContent extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('IDEAS'),
      ),
      body: Container(
        child: Stack(
          children: [
            floatingButton(context),
          ],
        ),
      ),
    );
  }

  Widget floatingButton(BuildContext context) {
    return Container(
      padding: const EdgeInsets.all(30),
      alignment: Alignment.bottomRight,
      child: FloatingActionButton(
        onPressed: () {
          Navigator.pushNamed(context, "/second");
        },
        child: Text("+"),
        backgroundColor: Colors.blue,
      ),
    );
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Route"),
      ),
      body: Center(
        child: RaisedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text('Go back!'),
        ),
      ),
    );
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM