Flutter Navigator Pop不起作用

Vox*_*vid 2 android dart flutter

昨天我发现扑了一下,虽然我有一个问题,但我已经尝试了一下.我已经按照教程实现了一个导航抽屉(这个),抽屉打开很好,所有和按钮改变他们应该改变的东西但是调用Navigator.pop(上下文)或Navigator.of(上下文).pop() (两者)表现得像这样:

在点击"人物"之前

点击之前

点击"人物"后

点击后

我在网上搜索过,但找不到有同样问题的人:/这是我的代码:

main.dart:

import 'package:flutter/material.dart';
import 'package:dnd/home.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        title: 'DnD',
        home: new Home()
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

home.dart:

import 'package:flutter/material.dart';
import 'package:dnd/home_fragment.dart';
import 'package:dnd/char_fragment.dart';

class Home extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new HomeState();
  }
}

class HomeState extends State<Home> {
  int selectedDrawerIndex = 0;

  getDrawerItemWidget(int pos) {
    switch(pos) {
      case 0:
        return new HomeFragment();
      case 1:
        return new CharFragment();

      default:
        return new Text('ERROR');
    }
  }

  onSelectItem(int index) {
    setState(() => selectedDrawerIndex = index);
    print(Navigator.of(context).pop());
  }

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'DnD',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text(
            'DnD'
          )
        ),
        drawer: new Drawer(
          child: new Column(
            children: <Widget>[
              new UserAccountsDrawerHeader(
                accountName: new Text(
                  'bla'
                ),
                accountEmail: null,
              ),
              new Column(
                children: <Widget>[
                  new ListTile(
                    title: new Text(
                      'Home'
                    ),
                    leading: new Icon(
                      Icons.home
                    ),
                    selected: 0 == selectedDrawerIndex,
                    onTap: () => onSelectItem(0),
                  ),
                  new ListTile(
                    title: new Text(
                      'Characters'
                    ),
                    leading: new Icon(
                      Icons.person
                    ),
                    selected: 1 == selectedDrawerIndex,
                    onTap: () => onSelectItem(1),
                  )
                ],
              ),
            ],
          ),
        ),
        body: getDrawerItemWidget(selectedDrawerIndex)
      )
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

home_fragment.dart:

import 'package:flutter/material.dart';

class HomeFragment extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Center(
      child: new Text(
        'moin'
      )
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

char_fragment.dart:

import 'package:flutter/material.dart';

class CharFragment extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
      return new CharState();
    }
}

class CharState extends State<CharFragment> {
  characterNew() async {
    await showDialog<bool>(
      context: context,
      child: new AlertDialog(
        title: new Text('Create new Character?'),
        actions: <Widget>[
          new FlatButton(
            child: new Text('Yes'),
            onPressed: () => Navigator.of(context).pop(true)
          ),
          new FlatButton(
            child: new Text('No'),
            onPressed: () => Navigator.of(context).pop(false)
          )
        ],
      )
    );
  }

  @override
  Widget build(BuildContext context) {
    return new Center(
      child: new GridView.count(
        crossAxisCount: 3,
        crossAxisSpacing: 10.0,
        mainAxisSpacing: 10.0,
        children: <Widget>[
          new RaisedButton.icon(
            onPressed: characterNew,
            icon: new Icon(Icons.add, size: 80.0,),
            label: new Text('')
          )
        ],
      )
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

azi*_*iza 7

您的代码中有两个错误:

  1. 您正在使用MaterialApp两次,您应该只有一个实例,MaterialApp因为它保存您的根配置.
  2. 你没有在Navigator堆栈上推送任何路由,所以你试图pop从一个空列表(即,堆栈内没有任何东西被弹出).

为了演示,你是Scaffold通过使用来控制身体的内容setState所以你正在切换HomeCharaters小部件之间他们真的看不到彼此(如果你选择Home小部件,你的Char小部件不是构建的,现在如果你选择你的Char小部件,你的Home小部件已经被它完全取代)


Kev*_*ter 6

在 home.dart 构建覆盖中。尝试返回 Scaffold 而不是 Material 应用程序的另一个实例。您现在在材料应用程序的主体中返回一个材料应用程序。你应该只返回 Scaffold 那里。