Flutter生命周期管理插件flutter_lifecycle_binding的使用

Flutter生命周期管理插件flutter_lifecycle_binding的使用

Aim

通过将 Future 绑定到 State,当 State 被销毁时,所有绑定的 Future 将被取消。


Usage

方法 1: 使用 BindingHelper

步骤 1: 创建 BindingHelper 实例

BindingHelper _helper = BindingHelper();

步骤 2: 将 Future 绑定到 BindingHelper

future.bindLifecycle(_helper).then((...));

步骤 3: 在 State 销毁时释放 BindingHelper

[@override](/user/override)
void dispose() {
  super.dispose();
  _helper.dispose();
}

方法 2: 使用 mixinState 中绑定

步骤 1: 在 State 中添加 mixin

import 'package:lifecycle_binding/lifecycle_binding.dart';
   
class _State extends State with StateLifecycleBinding

步骤 2: 将 Future 绑定到 State

future.bindLifecycleToState(this).then(() { ... });

Attention

  1. 如果你这样使用 Future
    future.then(() {
        // 部分 1
    });
    bindLifecycle(helper)
    .then(() {
        // 部分 2
    });
    
    • 部分 1 总会执行。
    • 部分 2 不会在 State 被销毁时执行。 因此,你应该将与 UI 相关的代码放在 部分 2 中。

Full Example

以下是一个完整的示例代码,展示了如何使用 BindingHelper 来管理生命周期:

import 'package:flutter/material.dart';
import 'package:flutter_lifecycle_binding/lifecycle_binding.dart';

class StatePage extends StatefulWidget {
  [@override](/user/override)
  State<StatefulWidget> createState() {
    return _State();
  }
}

class _State extends State {
  String text = "如果5秒内退出了页面,我不会被更新,也不会有日志打印";

  BindingHelper _helper = BindingHelper();

  [@override](/user/override)
  void initState() {
    super.initState();
    // 延迟5秒后更新文本
    Future.delayed(const Duration(seconds: 5), () {
      return "我被更新了";
    }).bindLifecycle(_helper).then((value) {
      text = value;
      print(text);
      setState(() {});
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Text(text),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
    // 释放 BindingHelper
    _helper.dispose();
  }
}

示例代码

以下是完整示例项目的代码,展示了如何在不同场景下使用该插件:

import 'package:flutter/material.dart';
import 'package:lifecycle_binding_example/state_page.dart';
import 'provider_page.dart';
import 'state_with_mixin_page.dart';

void main() {
  runApp(HomeApp());
}

class HomeApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: Builder(
          builder: (ctx) {
            return Container(
              child: Column(
                children: [
                  // 使用 BindingHelper 的按钮
                  RaisedButton(
                    onPressed: () {
                      Navigator.push(
                        ctx,
                        MaterialPageRoute(builder: (_) => StatePage()),
                      );
                    },
                    child: Text("使用 BindingHelper"),
                  ),
                  // 使用 mixin 的按钮
                  RaisedButton(
                    onPressed: () {
                      Navigator.push(
                        ctx,
                        MaterialPageRoute(builder: (_) => StateWithMixinPage()),
                      );
                    },
                    child: Text("使用 mixin StateLifecycleBinding"),
                  ),
                  // 在 provider 中使用的按钮
                  RaisedButton(
                    onPressed: () {
                      Navigator.push(
                        ctx,
                        MaterialPageRoute(builder: (_) => ProviderPage()),
                      );
                    },
                    child: Text("在 provider 中使用"),
                  ),
                ],
              ),
            );
          },
        ),
      ),
    );
  }
}

更多关于Flutter生命周期管理插件flutter_lifecycle_binding的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter生命周期管理插件flutter_lifecycle_binding的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_lifecycle_binding 是一个用于管理 Flutter 应用生命周期的插件。它允许你在应用的各个生命周期阶段执行特定的操作,例如在应用进入前台或后台时执行某些任务。以下是如何使用 flutter_lifecycle_binding 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 flutter_lifecycle_binding 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  flutter_lifecycle_binding: ^1.0.0

然后运行 flutter pub get 来获取依赖。

2. 初始化插件

在你的 main.dart 文件中,初始化 flutter_lifecycle_binding 插件。

import 'package:flutter/material.dart';
import 'package:flutter_lifecycle_binding/flutter_lifecycle_binding.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  FlutterLifecycleBinding.ensureInitialized();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Lifecycle Demo',
      home: MyHomePage(),
    );
  }
}

3. 监听生命周期事件

你可以通过 FlutterLifecycleBinding 来监听应用的生命周期事件。以下是监听应用进入前台和后台的示例:

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  [@override](/user/override)
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  [@override](/user/override)
  void didChangeAppLifecycleState(AppLifecycleState state) {
    switch (state) {
      case AppLifecycleState.resumed:
        print("App is in the foreground");
        break;
      case AppLifecycleState.inactive:
        print("App is inactive");
        break;
      case AppLifecycleState.paused:
        print("App is in the background");
        break;
      case AppLifecycleState.detached:
        print("App is detached");
        break;
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Lifecycle Demo'),
      ),
      body: Center(
        child: Text('Check the console for lifecycle events'),
      ),
    );
  }
}

4. 使用 FlutterLifecycleBinding 的其他功能

flutter_lifecycle_binding 还提供了其他功能,例如监听应用的生命周期状态的变化,或者获取当前的生命周期状态。

// 获取当前的生命周期状态
AppLifecycleState currentState = FlutterLifecycleBinding.instance.lifecycleState;

// 监听生命周期状态的变化
FlutterLifecycleBinding.instance.addObserver((state) {
  print("Lifecycle state changed: $state");
});

5. 处理特定的生命周期事件

你可以在特定的生命周期事件中执行一些操作,例如在应用进入后台时保存数据,或者在应用进入前台时刷新数据。

[@override](/user/override)
void didChangeAppLifecycleState(AppLifecycleState state) {
  if (state == AppLifecycleState.paused) {
    // 应用进入后台,保存数据
    _saveData();
  } else if (state == AppLifecycleState.resumed) {
    // 应用进入前台,刷新数据
    _refreshData();
  }
}

void _saveData() {
  // 保存数据的逻辑
}

void _refreshData() {
  // 刷新数据的逻辑
}

6. 移除监听器

在不再需要监听生命周期事件时,确保移除监听器以避免内存泄漏。

[@override](/user/override)
void dispose() {
  FlutterLifecycleBinding.instance.removeObserver(_lifecycleObserver);
  super.dispose();
}
回到顶部