Flutter资源清理插件disposing的使用

Flutter资源清理插件disposing的使用

Disposing 是一个 Flutter 包,它为许多类添加了 dispose 方法。此外,它还提供了 DisposableDisposableBag 来简化对可释放实例的管理。


安装

Dart 仅限

pubspec.yaml 文件中添加依赖项:

dependencies:
  disposing: ^1.0.3+1

Flutter

pubspec.yaml 文件中添加依赖项:

dependencies:
  flutter_disposing: ^1.0.3+1

运行 flutter pub get 来安装依赖。


如何使用

以下是使用 disposing 插件的基本步骤:

1. 导入 disposing.dart 文件

import 'package:disposing/disposing.dart';

2. 将实例转换为可释放对象

可以将 StreamSubscriptionStreamControllerTimer 等对象转换为可释放对象:

final streamDisp = stream.listen((v) => {}).asDisposable();
final timerDisp = timer.asDisposable();

3. (可选)将可释放实例添加到 SyncDisposableBag

可以使用 DisposableBag 来集中管理多个可释放对象:

final bag = DisposableBag();
bag.add(streamDisp);
bag.add(timerDisp);

或者直接将可释放对象绑定到 DisposableBag

stream.listen((v) => {}).disposeOn(bag);
timer.disposeOn(bag);

4. 释放资源

可以通过以下方式释放资源:

  • 不使用 DisposableBag

    await streamDisp.dispose();
    timerDisp.dispose();
    
  • 使用 DisposableBag

    await bag.dispose();
    

对于 Flutter 的扩展

flutter_disposing 提供了 Listenable 扩展方法和 DisposableBagStateMixin 类。

Listenable

ListenableChangeNotifier 的基类,用于 TextEditingControllerFocusNodeValueNotifier 等 Flutter 类。

使用 addDisposableListener 可以添加监听器并返回可释放实例:

final controller = TextEditingController();
final disp = controller.addDisposableListener(() => print(controller.text));

DisposableBagStateMixin

该混入类添加了一个 disposeBag 变量,并在小部件的状态被销毁时自动释放资源。

class ExampleWidget extends StatefulWidget {
  ExampleWidget({Key? key}) : super(key: key);

  [@override](/user/override)
  _ExampleWidgetState createState() => _ExampleWidgetState();
}

class _ExampleWidgetState extends State<ExampleWidget> with DisposableBagStateMixin {
  final controller = TextEditingController();

  [@override](/user/override)
  void initState() {
    // 自动释放定时器
    autoDispose(Timer.periodic(Duration(seconds: 1), (t) => {}).asDisposable());
    // 自动释放监听器
    autoDispose(controller.addDisposableListener(() => print(controller.text)));
    // 自动释放 TextEditingControlller
    autoDispose(controller.asDisposable());
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return TextField(
      controller: controller,
    );
  }
}

使用 using 方法

using 是一个实用方法,它会在回调执行完毕后自动释放可释放实例(类似于 C# 的 using 语句)。

await using(someDisposable, (disposable) async {
  // 在这里执行某些操作
});
assert(someDisposable.isDisposed, true);

完整示例 Demo

以下是一个完整的示例,展示如何使用 disposing 插件管理资源:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DisposingDemo(),
    );
  }
}

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

class _DisposingDemoState extends State<DisposingDemo> with DisposableBagStateMixin {
  final controller = TextEditingController();
  late final Disposable _listener;

  [@override](/user/override)
  void initState() {
    super.initState();

    // 使用 DisposableBag 管理资源
    _listener = controller.addDisposableListener(() => print('Text Changed: ${controller.text}'));
    autoDispose(_listener);
    autoDispose(controller.asDisposable());
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Disposing Demo')),
      body: Center(
        child: TextField(
          controller: controller,
        ),
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    // 自动释放资源
    super.dispose();
  }
}

更多关于Flutter资源清理插件disposing的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter资源清理插件disposing的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


disposing 是一个用于管理 Flutter 中资源清理的插件,它可以帮助你在 StateWidget 被销毁时自动释放资源,避免内存泄漏。这个插件特别适用于管理订阅、流、控制器等需要手动释放的资源。

安装

首先,在你的 pubspec.yaml 文件中添加 disposing 依赖:

dependencies:
  disposing: ^1.0.0

然后运行 flutter pub get 来安装依赖。

使用

disposing 插件提供了一个 Disposable 接口,你可以通过实现这个接口来定义需要释放的资源。Disposable 接口只有一个方法 void dispose(),你可以在其中释放资源。

基本用法

import 'package:disposing/disposing.dart';

class MyDisposable implements Disposable {
  [@override](/user/override)
  void dispose() {
    print('Resource disposed');
  }
}

void main() {
  final disposable = MyDisposable();
  disposable.dispose(); // 手动释放资源
}

在 Flutter Widget 中使用

在 Flutter 中,你可以将 disposingState 结合使用,以确保在 State 被销毁时自动释放资源。

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

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

class _MyWidgetState extends State<MyWidget> with DisposableMixin {
  [@override](/user/override)
  void initState() {
    super.initState();
    addDisposable(MyDisposable());
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container();
  }
}

class MyDisposable implements Disposable {
  [@override](/user/override)
  void dispose() {
    print('Resource disposed');
  }
}

在这个例子中,DisposableMixin 会自动在 State 被销毁时调用 dispose() 方法,从而释放资源。

管理多个资源

你可以使用 CompositeDisposable 来管理多个资源:

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

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

class _MyWidgetState extends State<MyWidget> with DisposableMixin {
  [@override](/user/override)
  void initState() {
    super.initState();
    final compositeDisposable = CompositeDisposable();
    compositeDisposable.add(MyDisposable());
    compositeDisposable.add(AnotherDisposable());
    addDisposable(compositeDisposable);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container();
  }
}

class MyDisposable implements Disposable {
  [@override](/user/override)
  void dispose() {
    print('MyDisposable disposed');
  }
}

class AnotherDisposable implements Disposable {
  [@override](/user/override)
  void dispose() {
    print('AnotherDisposable disposed');
  }
}
回到顶部