Flutter實戰(zhàn) 導(dǎo)航返回攔截(WillPopScope)

2021-03-08 11:35 更新

為了避免用戶誤觸返回按鈕而導(dǎo)致 APP 退出,在很多 APP 中都攔截了用戶點擊返回鍵的按鈕,然后進行一些防誤觸判斷,比如當(dāng)用戶在某一個時間段內(nèi)點擊兩次時,才會認(rèn)為用戶是要退出(而非誤觸)。Flutter 中可以通過WillPopScope來實現(xiàn)返回按鈕攔截,我們看看WillPopScope的默認(rèn)構(gòu)造函數(shù):

  1. const WillPopScope({
  2. ...
  3. @required WillPopCallback onWillPop,
  4. @required Widget child
  5. })

onWillPop是一個回調(diào)函數(shù),當(dāng)用戶點擊返回按鈕時被調(diào)用(包括導(dǎo)航返回按鈕及 Android 物理返回按鈕)。該回調(diào)需要返回一個Future對象,如果返回的Future最終值為false時,則當(dāng)前路由不出棧(不會返回);最終值為true時,當(dāng)前路由出棧退出。我們需要提供這個回調(diào)來決定是否退出。

#示例

為了防止用戶誤觸返回鍵退出,我們攔截返回事件。當(dāng)用戶在1秒內(nèi)點擊兩次返回按鈕時,則退出;如果間隔超過1秒則不退出,并重新記時。代碼如下:

  1. import 'package:flutter/material.dart';
  2. class WillPopScopeTestRoute extends StatefulWidget {
  3. @override
  4. WillPopScopeTestRouteState createState() {
  5. return new WillPopScopeTestRouteState();
  6. }
  7. }
  8. class WillPopScopeTestRouteState extends State<WillPopScopeTestRoute> {
  9. DateTime _lastPressedAt; //上次點擊時間
  10. @override
  11. Widget build(BuildContext context) {
  12. return new WillPopScope(
  13. onWillPop: () async {
  14. if (_lastPressedAt == null ||
  15. DateTime.now().difference(_lastPressedAt) > Duration(seconds: 1)) {
  16. //兩次點擊間隔超過1秒則重新計時
  17. _lastPressedAt = DateTime.now();
  18. return false;
  19. }
  20. return true;
  21. },
  22. child: Container(
  23. alignment: Alignment.center,
  24. child: Text("1秒內(nèi)連續(xù)按兩次返回鍵退出"),
  25. )
  26. );
  27. }
  28. }

讀者可以運行示例看看效果。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號