web-dev-qa-db-ja.com

catch Android 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.
13
Rizky Andriawan

戻るのを防ぐために 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());
22
Arnold Parge

これは私の実装方法であり、私にとってはうまく機能します。あなたはそれを試すことができます。

@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
Mitch

このコードは私のために機能します。

2つの理由があると思います。

  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;
          },
        ),
      ),
    );
    
1
蔡旻袁