Flutter:按下系统后退按钮时将结果添加到导航器

时间:2019-02-20 17:43:46

标签: android dart flutter

在下面的示例应用程序中,我有两条路线:HomeRouteOtherRoute。我希望OtherRoute在从导航器中弹出时始终返回结果。在此示例中,当按下RaisedButton中的OtherRoute时会执行此操作。但是,我也希望它在按下后退按钮时返回结果。我知道我可以覆盖AppBar上的后退按钮,但是我也想覆盖Android上“系统”后退按钮的行为。

我知道我可以使用WillPopScope来防止系统后退按钮弹出当前路线,但是我不希望这样做。如果可能的话,我希望系统后退按钮仍然能够弹出当前路线,只是包含结果。这可能吗?

这是我的示例应用程序:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Test',
      home: Scaffold(
        appBar: AppBar(title: Text("Home"),),
        body: HomeRoute(),
      ),
    );
  }
}

class HomeRoute extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return RaisedButton(onPressed: (){
      Navigator.push(context, MaterialPageRoute(builder: (context){
        return OtherRoute();
      })).then((result){
        // I want result here to never be null
        Scaffold.of(context).showSnackBar(SnackBar(content: Text("$result")));
      });
    });
  }
}

class OtherRoute extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Other route"),),
      body: RaisedButton(onPressed: (){
        Navigator.pop(context, "Result!");
      })
    );
  }
}

1 个答案:

答案 0 :(得分:2)

WillPopScope中用OtherRoute包裹脚手架,并覆盖onWillPop方法,如下所示:

@override
Widget build(BuildContext context) {
  return WillPopScope(
      //....
    ),
    onWillPop: () async {
      Navigator.pop(context, "Result!");
      return false;
    },
  );
}