Flutter引擎状态管理插件flutter_engine_state的使用
Flutter引擎状态管理插件flutter_engine_state的使用
这个包是由于WidgetBindingObserver无法知道Flutter活动是否已分离而创建的。当用户通过滑动或清除所有最近的应用程序按钮来清除应用时,AppLifecycleState.detached只在调用SystemNavigator.pop()时有效。
开始使用
这个包可以解决你想要知道应用活动是否已附加的问题。通过了解这些状态,你可以执行一些应在终止状态下运行的任务。
[@pragma](/user/pragma)('vm:entry-point')
Future<void> handleBackgroundGoogleMessage(RemoteMessage message) async {
debugPrint('\n==========BACKGROUND==========\n');
var sp = await SharedPreferences.getInstance();
await sp.reload();
var state = sp.getInt("flutterEngineState");
print(state);
if(state == 1){
// Flutter引擎已附加且活动已附加
// 执行某些操作
} else {
// Flutter引擎已附加但活动已分离
// 执行某些操作
}
}
你应该使用flutterEngineState
这个键来获取应用活动状态。
同时,我们还需要在AndroidManifest.xml
中添加服务以调用SharedPreferences,当用户通过滑动或清除所有最近的应用程序按钮来清除应用时。
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity
...
</activity>
...
<service android:name="com.zralogy.flutter_engine_state.AppClearService" android:stopWithTask="false"/>
...
</application>
</manifest>
示例代码
以下是一个完整的示例,展示了如何使用flutter_engine_state
插件:
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_engine_state/flutter_engine_state.dart';
import 'package:shared_preferences/shared_preferences.dart';
[@pragma](/user/pragma)('vm:entry-point')
Future<void> handleBackgroundGoogleMessage(RemoteMessage message) async {
debugPrint('\n==========BACKGROUND==========\n');
debugPrint('Got a message whilst in the background!');
var sp = await SharedPreferences.getInstance();
// 同步原生和Flutter之间的数据
await sp.reload();
var state = sp.getInt("flutterEngineState");
if (state != null) {
debugPrint('flutterEngineState: $state');
}
}
void main() {
Firebase.initializeApp();
FirebaseMessaging.onBackgroundMessage(handleBackgroundGoogleMessage);
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _platformVersion = 'Unknown';
final _flutterEngineStatePlugin = FlutterEngineState();
[@override](/user/override)
void initState() {
super.initState();
initPlatformState();
}
// 平台消息是异步的,所以我们初始化在一个异步方法中。
Future<void> initPlatformState() async {
String platformVersion;
// 平台消息可能会失败,所以我们使用try/catch处理PlatformException。
// 我们还处理消息可能返回null的情况。
try {
platformVersion = await _flutterEngineStatePlugin.getPlatformVersion() ??
'Unknown platform version';
} on PlatformException {
platformVersion = 'Failed to get platform version.';
}
// 如果小部件从树中被移除,而在异步平台消息还在进行时,我们应该丢弃回复而不是调用setState来更新我们的非存在外观。
if (!mounted) return;
setState(() {
_platformVersion = platformVersion;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('插件示例应用'),
),
body: Center(
child: Text('运行于: $_platformVersion\n'),
),
),
);
}
}
更多关于Flutter引擎状态管理插件flutter_engine_state的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter引擎状态管理插件flutter_engine_state的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_engine_state
是一个用于管理 Flutter 引擎状态的插件。它可以帮助开发者在 Flutter 应用中更轻松地管理和共享状态,尤其是在涉及多个页面或组件时。虽然 flutter_engine_state
并不是 Flutter 官方推荐的插件,但它的设计理念与常见的状态管理解决方案(如 Provider
、Riverpod
、Bloc
等)类似。
以下是如何使用 flutter_engine_state
插件的基本步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 flutter_engine_state
插件的依赖:
dependencies:
flutter:
sdk: flutter
flutter_engine_state: ^latest_version
运行 flutter pub get
来安装依赖。
2. 创建状态类
创建一个继承自 EngineState
的状态类。这个类将包含你需要在应用中共享的数据和方法。
import 'package:flutter_engine_state/flutter_engine_state.dart';
class CounterState extends EngineState {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners(); // 通知监听者状态已更新
}
void decrement() {
_count--;
notifyListeners(); // 通知监听者状态已更新
}
}
3. 注册状态
在应用的入口处(如 main.dart
中),注册你创建的状态类。
import 'package:flutter/material.dart';
import 'package:flutter_engine_state/flutter_engine_state.dart';
import 'counter_state.dart'; // 导入刚才创建的 CounterState
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return EngineStateProvider(
state: CounterState(), // 注册 CounterState
child: MaterialApp(
title: 'Flutter Engine State Example',
home: HomeScreen(),
),
);
}
}
4. 在 UI 中使用状态
在需要访问状态的组件中,使用 EngineState.of<T>()
来获取状态实例,并监听状态变化。
import 'package:flutter/material.dart';
import 'package:flutter_engine_state/flutter_engine_state.dart';
import 'counter_state.dart'; // 导入 CounterState
class HomeScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
final counterState = EngineState.of<CounterState>(context); // 获取 CounterState 实例
return Scaffold(
appBar: AppBar(
title: Text('Flutter Engine State Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Count: ${counterState.count}',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: counterState.increment,
child: Text('Increment'),
),
SizedBox(width: 20),
ElevatedButton(
onPressed: counterState.decrement,
child: Text('Decrement'),
),
],
),
],
),
),
);
}
}