在Flutter

时间:2018-05-21 16:10:47

标签: android dart flutter

有什么方法可以从Android后退按钮中捕获onBackPressed事件吗?

我尝试了WillPopScope但我的onWillPop功能仅在我点击材料后退箭头按钮时触发

我这样说:

class MyView extends StatelessWidget{

Widget build(BuildContext context) {

    return new WillPopScope(
      onWillPop: () async {
        debugPrint("Will pop");
        return true;
      },
      child: ScopedModel<AppModel>(
      model: new AppModel(),
      child: new Scaffold(......

我需要抓住它,因为不知何故我的屏幕在按下后退按钮时表现不正确,它弹出屏幕和它下方的屏幕,但不知何故,使用材质后退箭头按钮工作正常。

更新

the code works, my problem was not in the pop of this screen, but on the previous screen, I use 2 MaterialApp widgets, and somehow it gave a weird behavior.

5 个答案:

答案 0 :(得分:8)

为了防止导航WillPopScope是正确的方法,应按如下方式使用:

class Page2Route extends MaterialPageRoute {
  Page2Route() : super(builder: (context) => new Page2());
}

class Page2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new WillPopScope(
      child: new Scaffold(
        appBar: new AppBar(
          title: new Text('Page 2'),
        ),
        body: new Center(
          child: new Text('PAGE 2'),
        ),
      ),
      onWillPop: () {
        return new Future(() => false);
      },
    );
  }
}

可以像以下一样调用页面:

Navigator.of(context).push(new Page2Route());

请勿使用以下方法进行导航,因为它与最新的Flutter存在一些问题:

Navigator.push(context, new Page2Route());

答案 1 :(得分:1)

这就是我实施我的方法,对我来说很好。您可以尝试一下。

@override
Widget build(BuildContext context) {
  return WillPopScope(
    onWillPop: () {
      _moveToSignInScreen(context);
    },
    child: Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        leading: IconButton(
            icon: Icon(Icons.arrow_back),
            onPressed: () {
              _moveToSignInScreen(context);
            }),
        title: Text("Profile"),
      ),
    ),
  );
}

void _moveToSignInScreen(BuildContext context) =>
    Navigator.pushReplacementNamed(context, Routes.keySignIn);

答案 2 :(得分:0)

此代码适用于我。

我认为可能有两个原因。

  1. WillPopScope的孩子是脚手架
  2. onWillPop没有回复

    return new WillPopScope(
      onWillPop: () {
        if (!_isOpened) Navigator.pop(context);
      },
      child: new Scaffold(
        key: SharedService.orderScaffoldKey,
        appBar: appBar,
        body: new Builder(
          builder: (BuildContext context) {
            return page;
          },
        ),
      ),
    );
    

答案 3 :(得分:0)

另一种方法是实现NavigatorObserver并将其链接到MaterialApp

https://api.flutter.dev/flutter/widgets/RouteObserver-class.html

您不必使用RouteAware,也可以实现自己的NavigatorObserver

例如,这是Flutter分析如何自动跟踪屏幕打开/关闭的方式:

        MaterialApp(
          ...
          navigatorObservers: [
           FirebaseAnalyticsObserver(analytics: analytics),
          ],
        )

FirebaseAnalyticsObserver扩展了本身实现RouteObserver的{​​{1}}。

然而,NavigatorObserver通常是更简单的解决方案

答案 4 :(得分:0)

在这里添加一个重要的点。 请注意,通过使用 WillPopScope,我们将失去 iOS 上的向后滑动手势。

参考:https://github.com/flutter/flutter/issues/14203