0

在我的应用程序中,我需要在 call 之前执行代码Navigator.push。但问题是如果用户在执行代码之前按下后退按钮,则会出现错误:

E/flutter(8415):[错误:flutter/lib/ui/ui_dart_state.cc(148)]未处理的异常:查找已停用小部件的祖先是不安全的。E/flutter (8415):此时小部件的元素树的状态不再稳定。E/flutter (8415):要在其 dispose() 方法中安全地引用小部件的祖先,请通过在小部件的 didChangeDependencies() 方法中调用 inheritFromWidgetOfExactType() 来保存对祖先的引用。

Navigator.push问题是即使用户按下后退按钮(在 中) ,代码仍在执行并且正在调用Widget2

这是mwe:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Widget1(),
    );
  }
}

class Widget1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RaisedButton(
          onPressed: () async {
            await Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => Widget2(),
                ));
          },
        ),
      ),
    );
  }
}

class Widget2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(body: RaisedButton(
      onPressed: () async {
//      Press back button before Future complete
        await Future.delayed(Duration(seconds: 5));
        await Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => Widget3(),
            ));
      },
    ));
  }
}

class Widget3 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(child: Text('Widget 3'));
  }
}
4

1 回答 1

0

您可以做几件事,具体取决于您到底想要什么:

  • 要将当前视图替换为新视图,防止用户导航回上一页,请使用Navigator.pushReplacement(...)
  • 要在应用栏中显示后退按钮,但阻止用户返回Scaffold,请使用WillPopScope包装你,并使onWillPop属性返回一个Future.value(false).
  • 要简单地隐藏后退按钮按钮,请选择:AppBar(...,automaticallyImplyLeading: false,...)。用户仍然可以通过按 Android 中的后退按钮或 iOS 中的滑动手势返回。
于 2019-10-29T12:27:55.623 回答