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.
戻るのを防ぐために 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());
これは私の実装方法であり、私にとってはうまく機能します。あなたはそれを試すことができます。
@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つの理由があると思います。
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;
},
),
),
);