Flutter学習ノート(26)--戻ってWillPopScopeをブロックし、1秒以内に2回戻るボタンをクリックしてプログラムを終了する
4840 ワード
転載する場合は、出典を明記してください:Flutter学習ノート(26)--戻ってWillPopScopeをブロックして、1秒以内に2回の戻るボタンをクリックしてプログラムを終了することを実現します
実際の開発では,ユーザが戻りボタンを誤ってタッチしてプログラムが終了することを防止するために,通常は1秒以内に2回連続してクリックしてアプリケーションを終了するように設定されている.Androidの一般的な処理方法はonKeyDownメソッド内で計時処理を行い、keyCode==KeyEvent.KEYCODE_BACKが2回クリックして戻るボタンの間隔が1秒未満であればアプリケーションを終了し、FlutterではWillPopScopeで戻るボタンをブロックし、その内部で計時処理を行うことができる.
WillPopScopeコンストラクタ:
onWillPopは、ユーザが戻るボタンをクリックしたときに呼び出されるコールバック関数であり、ここでの戻るボタンには、Futureオブジェクトを返す必要があるナビゲーション戻るボタンと、戻るFutureの最終値がfalseの場合、現在のルーティングはスタックを出ない(返さない)が、trueに戻ると現在のルーティングはスタックを出ない(返さない)が含まれる.
次のDemoは、1秒に2回連続してクリックしてアプリケーションを終了する機能を実現しています.タイミング処理を行うには,現在の時間を取得し,2回のクリック間の時間差を計算する必要がある.
現在の時刻を取得:
現在の時刻と前回クリックした時刻の差を計算します.
時間差判定(1秒より大きいかどうか):
完全なDemoの例:
実際の開発では,ユーザが戻りボタンを誤ってタッチしてプログラムが終了することを防止するために,通常は1秒以内に2回連続してクリックしてアプリケーションを終了するように設定されている.Androidの一般的な処理方法はonKeyDownメソッド内で計時処理を行い、keyCode==KeyEvent.KEYCODE_BACKが2回クリックして戻るボタンの間隔が1秒未満であればアプリケーションを終了し、FlutterではWillPopScopeで戻るボタンをブロックし、その内部で計時処理を行うことができる.
WillPopScopeコンストラクタ:
const WillPopScope({
Key key,
@required this.child,
@required this.onWillPop,// ,
})
onWillPopは、ユーザが戻るボタンをクリックしたときに呼び出されるコールバック関数であり、ここでの戻るボタンには、Futureオブジェクトを返す必要があるナビゲーション戻るボタンと、戻るFutureの最終値がfalseの場合、現在のルーティングはスタックを出ない(返さない)が、trueに戻ると現在のルーティングはスタックを出ない(返さない)が含まれる.
次のDemoは、1秒に2回連続してクリックしてアプリケーションを終了する機能を実現しています.タイミング処理を行うには,現在の時間を取得し,2回のクリック間の時間差を計算する必要がある.
現在の時刻を取得:
DateTime.now()
現在の時刻と前回クリックした時刻の差を計算します.
DateTime.now().difference(_lastPressedAt)
時間差判定(1秒より大きいかどうか):
DateTime.now().difference(_lastPressedAt) > Duration(seconds: 1)
完全なDemoの例:
import 'package:flutter/material.dart';
void main() => runApp(DemoApp());
class DemoApp extends StatefulWidget {
@override
State createState() {
return new DemoAppState();
}
}
class DemoAppState extends State {
DateTime _lastPressedAt;//
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'WillPopScope Demo',
home: new Scaffold(
appBar: new AppBar(
title: new Text('WillPopScope Demo'),
),
body: new WillPopScope(
child: new Center(
child: new Text('WillPopScope'),
),
onWillPop: () async{
if(_lastPressedAt == null || (DateTime.now().difference(_lastPressedAt) > Duration(seconds: 1))){
// 1 ,
_lastPressedAt = DateTime.now();
print(_lastPressedAt);
return false;
}
return true;
}
),
),
);
}
}