flutter实现桌面返回功能
最近在写flutter的App,需要实现返回键退出时回到桌面而不是退出App
上网找了些资料,但是由于都是老版本,导致
- FlutterActivity引用的位置不一样
- GeneratedPluginRegistrant.registerWith(this)的this应用不成功
- 没有getFlutterView()方法
查询了部分资料后,发现以前的FlutterActivity已经被废弃,需要根据最新的方法写逻辑。
首先在android包下的MainActivity中,修改
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;
public class MainActivity extends FlutterActivity {
//返回手机桌面事件
static final String eventBackDesktop = "backDesktop";
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
//通讯名称,回到手机桌面
String CHANNEL = "android/back/desktop";
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
.setMethodCallHandler(
(call, result) -> {
if (call.method.equals(eventBackDesktop)) {
moveTaskToBack(false);
result.success(true);
}
}
);
}
}
接下来在Flutter的lib下添加一个android_back_desktop.dart文件:
import 'package:flutter/services.dart';
class AndroidBackDesktop{
//通讯名称,回到手机桌面
static const String CHANNEL = "android/back/desktop";
//设置回退到手机桌面事件
static const String eventBackDesktop = "backDesktop";
//设置回退到手机桌面方法
static Future<bool> backToDesktop() async {
final platform = MethodChannel(CHANNEL);
//通知安卓返回到手机桌面
try{
await platform.invokeMethod(eventBackDesktop);
}
on PlatformException catch (e){
print("通信失败,设置回退到安卓手机桌面失败");
print(e.toString());
}
return Future.value(false);
}
}
最后在main.dart中使用WillPopScope包裹,在onWillpop中调用通知回到桌面方法(注意,不一定是main.dart,主要在你的主界面,因项目而异):
import 'package:an_chang_app/src/pages/work/order_add_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:an_chang_app/src/pages/home/home_item3_page.dart';
import 'package:an_chang_app/src/pages/home/home_item_page.dart';
import 'pages/mine/mine_main_page.dart';
import 'utils/android_back_desktop.dart';
///首页面
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
//当前选中的标识
int _currentIndex = 0;
PageController _pageController = new PageController();
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: AndroidBackDesktop.backToDesktop,
child: Scaffold(
body: Container(
width: double.infinity,
height: double.infinity,
child: PageView(
controller: _pageController,
//不可左右滑动
physics: NeverScrollableScrollPhysics(),
children: [
//第四个文章列表页面
HomeItem3Page(),
//第五个个人中心页面
MineMainPage(),
],
),
),
bottomNavigationBar: BottomNavigationBar(
//当前选中的Item 默认为 0
currentIndex: _currentIndex,
//点击回调
onTap: (int value) {
setState(() {
_currentIndex = value;
_pageController.jumpToPage(value);
});
},
//显示文字
type: BottomNavigationBarType.fixed,
//选中的颜色
selectedItemColor: Colors.redAccent,
//未选中颜色
unselectedItemColor: Colors.blueGrey,
items: [
BottomNavigationBarItem(icon: Icon(Icons.message), label: "工单"),
BottomNavigationBarItem(icon: Icon(Icons.person), label: "我的"),
],
),
),
);
}
}