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

1 回复

更多关于Flutter引擎状态管理插件flutter_engine_state的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_engine_state 是一个用于管理 Flutter 引擎状态的插件。它可以帮助开发者在 Flutter 应用中更轻松地管理和共享状态,尤其是在涉及多个页面或组件时。虽然 flutter_engine_state 并不是 Flutter 官方推荐的插件,但它的设计理念与常见的状态管理解决方案(如 ProviderRiverpodBloc 等)类似。

以下是如何使用 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'),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部