4Manuals

  • PDF Cloud HOME

切换页面 Download

    从文件初始化类的最佳方法(异步)? 此声明在dart中的Future类中意味着什么:FutureOr <R>函数(动态)onValue 从网络加载图像时,“接收到完整的报头之前关闭连接 BackdropFilter如何应用它的过滤器? Flutter:Java使用或覆盖已弃用的API Flutter-如何从认证错误链接获取API响应 Flutter网站网址导航 Dart Linter:在Lambda之外的所有地方强制执行类型注释 如何使用带有自定义入口点的FlutterFragment在我的Android应用中嵌入Flutter布局? 如何设置容器高度以适合屏幕

我有一个使用Drawer Widget创建的侧面菜单,我想在侧面菜单中的页面之间导航。我正在使用Navigator.push()这样做,但是由于某些原因,页面不会更改。

这些项目显示在侧面菜单中,但是当单击时,页面保持不变。有人知道我在滥用Navigator.push()吗?

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override 
  Widget build(BuildContext context){
    return MaterialApp(
      title: 'Grid App',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Grip App'),
        ),
        body: Center(
          child: Text('Hello, this is the start page!'),
        ),
        drawer: Drawer(
          child: ListView(
            children: <Widget>[
              DrawerHeader(
                child: Text("Navigation"),
                decoration: BoxDecoration(
                color: Colors.grey[700]
                ),
              ),
              ListTile(
                title: Text("First Page"),
                onTap: (){
                  Navigator.push(
                    context, 
                    MaterialPageRoute(builder: (context) => FirstPage()),);
                },
              ),
              ListTile(
                title: new Text("Second Page"),
                onTap: () {
                  Navigator.push(context,
                    new MaterialPageRoute(builder: (context) => new SecondPage()),);
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class FirstPage extends StatelessWidget{
  @override 
  Widget build(BuildContext context){
    return Scaffold(
      appBar: AppBar(
        title: Text("First Page"),
      ),
        body: Center(
          child: Text("You're on the first page!"),
        ),
    );
  }
}

class SecondPage extends StatelessWidget{
  @override 
  Widget build(BuildContext context){
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Page"),
      ),
        body: Text("This is the second page"),
    );
  }
}

4 个答案:

答案 0 :(得分:0)

快速修复

void main() => runApp(MaterialApp(home: MyApp()));

您遇到的错误

您当前的代码显示以下错误,您也可以在控制台中看到它

  

错误:处理手势时引发了以下断言:   请求的导航器操作使用了不包含导航器的上下文。   用于从导航器推送或弹出路由的上下文必须是作为导航器小部件的后代的小部件的上下文。

     

您可以采用MaterialApp或Builder

来解决此问题

答案 1 :(得分:0)

如果您在正在使用的MateriaApp上下文中进行操作,则导航器将无法工作。将MaterialApp小部件删除到main()或为此创建另一个小部件。

尝试一下:


import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';

void main() => runApp(MaterialApp(
  home: MyApp(),
));

class MyApp extends StatelessWidget {
  @override 
  Widget build(BuildContext context){
    return Scaffold(
        appBar: AppBar(
          title: Text('Grip App'),
        ),
        body: Center(
          child: Text('Hello, this is the start page!'),
        ),
        drawer: Drawer(
          child: ListView(
            children: <Widget>[
              DrawerHeader(
                child: Text("Navigation"),
                decoration: BoxDecoration(
                color: Colors.grey[700]
                ),
              ),
              ListTile(
                title: Text("First Page"),
                onTap: (){
                  Navigator.push(
                    context, 
                    MaterialPageRoute(builder: (context) => FirstPage()),);
                },
              ),
              ListTile(
                title: new Text("Second Page"),
                onTap: () {
                  Navigator.push(context,
                    new MaterialPageRoute(builder: (context) => new SecondPage()),);
                },
              ),
            ],
          ),
        ),
    );
  }
}

class FirstPage extends StatelessWidget{
  @override 
  Widget build(BuildContext context){
    return Scaffold(
      appBar: AppBar(
        title: Text("First Page"),
      ),
        body: Center(
          child: Text("You're on the first page!"),
        ),
    );
  }
}

class SecondPage extends StatelessWidget{
  @override 
  Widget build(BuildContext context){
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Page"),
      ),
        body: Text("This is the second page"),
    );
  }
}

答案 2 :(得分:0)

这里最大的问题是使用了错误的上下文。

您不能将App上下文用于Navigator。尝试使用Builder

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Grid App',
      home: Builder(
        builder: (context) => buildScaffold(context),
      ),
    );
  }

  Scaffold buildScaffold(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Grip App'),
      ),
      body: Center(
        child: Text('Hello, this is the start page!'),
      ),
      drawer: Drawer(
        child: ListView(
          children: <Widget>[
            DrawerHeader(
              child: Text("Navigation"),
              decoration: BoxDecoration(color: Colors.grey[700]),
            ),
            ListTile(
              title: Text("First Page"),
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => FirstPage()),
                );
              },
            ),
            ListTile(
              title: new Text("Second Page"),
              onTap: () {
                Navigator.push(
                  context,
                  new MaterialPageRoute(builder: (context) => new SecondPage()),
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

答案 3 :(得分:0)

只需将 MaterialApp 与另一个屏幕分开。只需右键单击 Scaffold 小部件,然后选择 Extract Widget 。给您的小部件命名,它将代码提取到另一个无状态小部件中。

将此代码复制粘贴到dartpad并运行

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override 
  Widget build(BuildContext context){
    return MaterialApp(
      title: 'Grid App',
      home: NewApp(),
    );
  }
}

class NewApp extends StatelessWidget {
  const NewApp({
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Grip App'),
      ),
      body: Center(
        child: Text('Hello, this is the start page!'),
      ),
      drawer: Drawer(
        child: ListView(
          children: <Widget>[
            DrawerHeader(
              child: Text("Navigation"),
              decoration: BoxDecoration(
              color: Colors.grey[700]
              ),
            ),
            ListTile(
              title: Text("First Page"),
              onTap: (){
                Navigator.push(
                  context, 
                  MaterialPageRoute(builder: (context) => FirstPage()),);
              },
            ),
            ListTile(
              title: new Text("Second Page"),
              onTap: () {
                Navigator.push(context,
                  new MaterialPageRoute(builder: (context) => new SecondPage()),);
              },
            ),
          ],
        ),
      ),
    );
  }
}

class FirstPage extends StatelessWidget{
  @override 
  Widget build(BuildContext context){
    return Scaffold(
      appBar: AppBar(
        title: Text("First Page"),
      ),
        body: Center(
          child: Text("You're on the first page!"),
        ),
    );
  }
}

class SecondPage extends StatelessWidget{
  @override 
  Widget build(BuildContext context){
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Page"),
      ),
        body: Text("This is the second page"),
    );
  }
}



Similar searches
    IntersectionObserver观察视口中的document.body上边缘 openlayers中的npm似乎需要重新编写所有代码 返回具有给定键及其值的新对象 如何使用Node.js将文件上传到AWS中的预签名URL? 如何将多个图像作为输入输入到卷积神经网络