一、按返回鍵禁止退出
適用于即時(shí)通訊項(xiàng)目
1、先在lib下新建文件
android_back_desktop.dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
class AndroidBackTop {
//初始化通信管道-設(shè)置退出到手機(jī)桌面
static const String CHANNEL = "android/back/desktop";
//設(shè)置回退到手機(jī)桌面
static Future<bool> backDeskTop() async {
final platform = MethodChannel(CHANNEL);
//通知安卓返回,到手機(jī)桌面
try {
final bool out = await platform.invokeMethod('backDesktop');
if (out) debugPrint('返回到桌面');
} on PlatformException catch (e) {
debugPrint("通信失敗(設(shè)置回退到安卓手機(jī)桌面:設(shè)置失敗)");
print(e.toString());
}
return Future.value(false);
}
}
2、在要攔截返回的頁(yè)面使用 WillPopScope
Widget build(BuildContext context) {
// TODO: implement build
return WillPopScope(
onWillPop: _onBackPressed,
child: Container()
);
}
Future<bool> _onBackPressed() async {
AndroidBackTop.backDeskTop(); //設(shè)置為返回不退出app
return false;
}
3、修改 android 目錄下 MainActivity
?? 注意,根據(jù) flutter sdk 版本和開(kāi)發(fā)語(yǔ)言(Java、kotlin)不同,方式可能有差異
新版本無(wú)法直接使用 getFlutterView()
改為 getFlutterEngine().getDartExecutor().getBinaryMessenger()
方法一:
也是百度最多的一種,新版已經(jīng)不用了
private final String CHANNEL = "android/back/desktop";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
(methodCall, result) -> {
if (methodCall.method.equals("backDesktop")) {
result.success(true);
moveTaskToBack(false);
}
}
);
}
方法二(kotlin):
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant.*
class MainActivity: FlutterActivity() {
private val CHANNEL = "android/back/desktop"
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
registerWith(flutterEngine);
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { methodCall, result ->
if (methodCall.method == "backDesktop") {
result.success(true)
moveTaskToBack(false)
}
}
}
}
二、再按一次退出app
int lastExitTime = 0;
Future<bool> _onBackPressed() async {
int nowExitTime = DateTime.now().millisecondsSinceEpoch;
if (nowExitTime - lastExitTime > 2000) {
lastExitTime = nowExitTime;
ToastUtils.show(S.of(context).g_key_289);
return await Future.value(false);
}else {
exit(0);
return await Future.value(true);
}
}