Flutter资源清理插件disposing的使用
Flutter资源清理插件disposing的使用
Disposing 是一个 Flutter 包,它为许多类添加了 dispose 方法。此外,它还提供了 Disposable 和 DisposableBag 来简化对可释放实例的管理。
安装
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. 将实例转换为可释放对象
可以将 StreamSubscription、StreamController、Timer 等对象转换为可释放对象:
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
Listenable 是 ChangeNotifier 的基类,用于 TextEditingController、FocusNode、ValueNotifier 等 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
更多关于Flutter资源清理插件disposing的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
disposing 是一个用于管理 Flutter 中资源清理的插件,它可以帮助你在 State 或 Widget 被销毁时自动释放资源,避免内存泄漏。这个插件特别适用于管理订阅、流、控制器等需要手动释放的资源。
安装
首先,在你的 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 中,你可以将 disposing 与 State 结合使用,以确保在 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');
}
}

