【问题标题】:Prevent Navigator.push if user press back button如果用户按下后退按钮,则阻止 Navigator.push
【发布时间】:2020-02-24 16:04:21
【问题描述】:

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

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

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

这是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'));
  }
}

【问题讨论】:

    标签: flutter dart flutter-navigation flutter-onpressed


    【解决方案1】:

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

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

    【讨论】:

    • 我不想阻止用户按下返回按钮。我想阻止在用户按下RaisedButton 后按下返回按钮时在Widget2 中调用Navigator.push
    • 我明白了,对不起,我一开始没有理解你的问题。我想你可以尝试做的是让你的Widget2 有状态,定义一个默认为false 的布尔变量didPressBack,并将Widget2 的脚手架包装在WillPopScope 小部件中,这将检测到如果用户按下后退按钮。在onWillPop 函数中,将didPressBack 变量更改为true,然后在Widget2onPress 函数中,仅当didPressBackfalse 时才导航。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多