- 需求:用户在首页点击返回按钮不关闭应用
- 实现:重写onWillPop
- 坑点:①中文网提供的有问题,②网络资源大部分都基于java
先贴一下中文网的写法:点击看看
import android.os.Bundle
import io.flutter.app.FlutterActivity
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity() : FlutterActivity() {
private val CHANNEL = "samples.flutter.io/battery"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
GeneratedPluginRegistrant.registerWith(this)
MethodChannel(flutterView, CHANNEL).setMethodCallHandler { call, result ->
// TODO
}
}
}
两个问题
- 项目默认引入是
io.flutter.embedding.android.FlutterActivity
,而不是io.flutter.app.FlutterActivity
,采用中文网这个包,会造成各种问题,比如:编译不过、插件异常 - 中文网中的调用方法是写在
onCreate
中,而注册语句是GeneratedPluginRegistrant.registerWith(this)
,这个是不生效的,实际上应该写在configureFlutterEngine
中,不需要实现onCreate
返回按钮不退出功能参考代码
package 你的包
import io.flutter.embedding.android.FlutterActivity
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.embedding.engine.FlutterEngine
class MainActivity: FlutterActivity(){
//通讯名称,回到手机桌面
private val chanel = "android/back/desktop"
//返回手机桌面事件
val eventBackDesktop = "backDesktop"
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
MethodChannel(flutterEngine.dartExecutor, chanel).setMethodCallHandler {methodCall: MethodCall, result: MethodChannel.Result ->
if (methodCall.method.equals(eventBackDesktop)) {
moveTaskToBack(false)
result.success(true)
}
}
}
}
Dart中通讯写法
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
class AndroidBackTop {
///通讯名称,回到手机桌面
static const String chanel = "android/back/desktop";
//返回手机桌面事件
static const String eventBackDesktop = "backDesktop";
///设置回退到手机桌面
static Future<bool> backDesktop() async {
final platform = MethodChannel(chanel);
try {
await platform.invokeMethod(eventBackDesktop);
} on PlatformException catch (e) {
debugPrint(e.toString());
}
return Future.value(false);
}
}
调用
return new WillPopScope(
onWillPop: AndroidBackTop.backDesktop,
child: Scaffold(),
);