本篇爲繼上片監聽返回鍵基礎下優化:javascript
如下作返回鍵監聽兩種狀況:java
import 'package:fluttertoast/fluttertoast.dart'; //提示第三方插件
1. 單擊提示雙擊退出,雙擊時退出Appandroid
DateTime _lastPressedAt; //上次點擊時間
main.dart-MyApp中: home: WillPopScope( // 監聽返回鍵Widget onWillPop: () async { // 點擊返回鍵即觸發該事件 if (_lastPressedAt == null) { //首次點擊提示...信息 Fluttertoast.showToast( msg: "雙擊退出程序...", gravity: ToastGravity.BOTTOM, timeInSecForIos: 1, backgroundColor: Colors.grey[400], textColor: Colors.white, fontSize: ScreenUtil().setWidth(12), ); } if (_lastPressedAt == null || DateTime.now().difference(_lastPressedAt) > Duration(seconds: 1)) { //兩次點擊間隔超過1秒則從新計時 _lastPressedAt = DateTime.now(); return false; // 不退出 } return true; //退出 }, child: Pages(), ),
2. 單擊返回手機桌面,不退出App併發
main.dart文件app
import 'package:flutter_smart_park/untils/android_back_desktop.dart'; home: WillPopScope( onWillPop: () async { AndroidBackTop.backDeskTop(); return false; }, child: configProvide.token == '0' ? UserLogIn() : Pages(), ),
android_back_desktop.dartasync
import 'package:flutter/services.dart'; import 'package:flutter/material.dart';
class AndroidBackTop { //初始化通訊管道-設置退出到手機桌面 static const String CHANNEL = "android/back/desktop"; //設置回退到手機桌面 static Future<bool> backDeskTop() async { final platform = MethodChannel(CHANNEL); //通知安卓返回,到手機桌面 try { final bool out = await platform.invokeMethod('backDesktop'); if (out) debugPrint('返回到桌面'); } on PlatformException catch (e) { debugPrint("通訊失敗(設置回退到安卓手機桌面:設置失敗)"); print(e.toString()); } return Future.value(false); } }
需在MainActivity.java文件中添加配置:ide
import android.os.Bundle; import android.view.KeyEvent;import io.flutter.app.FlutterActivity; import io.flutter.plugins.GeneratedPluginRegistrant; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel;
public class MainActivity extends FlutterActivity {
//通信名稱,回到手機桌面 private final String CHANNEL = "android/back/desktop"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GeneratedPluginRegistrant.registerWith(this);
MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler( MethodChannel.MethodCallHandler() { @Override public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) { if (methodCall.method.equals("backDesktop")) { result.success(true); moveTaskToBack(false); //是否關閉 } } } ); } }
附加: MethodChannel 本地訪問優化
在客戶端,MethodChannel(API)容許發送與方法調用相對應的消息。 在平臺方 面,Android(API)上的MethodChannel和 iOS(API)上的 FlutterMethodChannel啓用接收方法調用併發回結果。this
import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result;
申明變量CHANNEL,值與定義觸發事件包名相同,以上android_back_desktop爲例:spa
private final String CHANNEL = "android/back/desktop";
在MethodChannel的中調用.setMethodCallHandler()
方法,須要一個MethodCallHandler
對象,是一個匿名內部類,有一個方法onMethodCall
,在Flutter發送請求事,onMethodCall
方法會執行。
public class MainActivity extends FlutterActivity { private static final String CHANNEL = "android_back_desktop"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GeneratedPluginRegistrant.registerWith(this); MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler( MethodCallHandler() { @Override public void onMethodCall(MethodCall methodCall, Result result) { } } ); } }
onMethodCall方法中有兩個參數 MethodCall 和 result,MethodCall 中有關當前請求的信息,例如調用方法的名字changeLife;Result用於發送信息給Flutter。
在onMethodCall中判斷當前請求是否爲changeLife,若是是經過result 的 success 返回信息:Life Changed .
public void onMethodCall(MethodCall methodCall, Result result) { if (methodCall.method.equals("backDesktop")){ String message ="Life Changed"; result.success(message); } ...