Flutter资源管理插件disposer的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter资源管理插件disposer的使用

欢迎使用Disposable包

disposer 是一个简单的接口,用于管理所有需要被释放的实例。

示例

以下是一个基本的 DataSource 类的示例,该类实现了 Disposable 接口:

import 'dart:async';
import 'package:disposer/disposer.dart';

class DataSource with Disposable {
  final streamController = StreamController.broadcast();
  
  @override
  void dispose() {
    streamController.close();
  }
}

多级依赖示例

以下是一个多级依赖的示例,展示了如何在多个类之间管理资源的释放:

import 'dart:async';
import 'package:disposer/disposer.dart';

void main() {
  final LocalDataSource localDataSource = LocalDataSource();
  final RemoteDataSource remoteDataSource = RemoteDataSource();
  final DataRepository dataRepository = DataRepository(
    localDataSource: localDataSource,
    remoteDataSource: remoteDataSource,
  );
  final DataUsecase dataUsecase = DataUsecase(repository: dataRepository);
  dataUsecase.dispose();

  // 输出:
  /*
    [log] LocalDataSource Disposed
    [log] RemoteDataSource Disposed
    [log] DataRepository Disposed
    [log] DataUsecase Disposed
  */
}

class LocalDataSource with Disposable {
  final streamController = StreamController.broadcast();

  @override
  void dispose() {
    streamController.close();
    super.dispose();
  }
}

class RemoteDataSource with Disposable {
  final streamController = StreamController.broadcast();

  @override
  void dispose() {
    streamController.close();
    super.dispose();
  }
}

class DataRepository with Disposable {
  DataRepository({
    required this.localDataSource,
    required this.remoteDataSource,
  });

  @override
  List<Disposable> get disposables => [
        localDataSource,
        remoteDataSource,
      ];

  final LocalDataSource localDataSource;
  final RemoteDataSource remoteDataSource;
}

class DataUsecase with Disposable {
  DataUsecase({
    required this.repository,
  });

  @override
  List<Disposable> get disposables => [
        repository,
      ];

  final DataRepository repository;
}

特性生成器

未来生成器创建新的清洁架构特性

Flutter Clean Architecture

文件夹结构

Folders Structure

开始使用特性生成器

第一种方法

激活全局 pub 包。使用这种方法,你可以在全局范围内使用特性生成器。

激活:

dart pub global activate disposer

使用:

disposer --name NewFeature --output lib/src/features

第二种方法

disposer 作为依赖项添加到你的项目中。

pubspec.yaml 文件中添加:

dependencies:
  disposer: ^0.0.7

使用:

flutter pub run disposer --name NewFeature --output lib/src/features

特性命名约定:

-n example
--name example
-n Example
--name Example
-n ExampleFeature
--name ExampleFeature

输出参数是可选的,默认路径是:lib/features

示例:

-o lib/src/features
--output lib/src/features

完整示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 disposer

import 'dart:async';
import 'package:disposer/disposer.dart';
import 'package:flutter/material.dart';

void main() {
  final LocalDataSource localDataSource = LocalDataSource();
  final RemoteDataSource remoteDataSource = RemoteDataSource();
  final DataRepository dataRepository = DataRepository(
    localDataSource: localDataSource,
    remoteDataSource: remoteDataSource,
  );
  final DataUsecase dataUsecase = DataUsecase(repository: dataRepository);
  dataUsecase.dispose();

  // 输出:
  /*
    [log] LocalDataSource Disposed
    [log] RemoteDataSource Disposed
    [log] DataRepository Disposed
    [log] DataUsecase Disposed
  */

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Disposer Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Disposer Example'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with Disposable {
  @override
  void initState() {
    super.initState();
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  List<Disposable> get disposables => [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'This is an example of using disposer in a Flutter app.',
            ),
          ],
        ),
      ),
    );
  }
}

class LocalDataSource with Disposable {
  final streamController = StreamController.broadcast();

  @override
  void dispose() {
    streamController.close();
    super.dispose();
  }
}

class RemoteDataSource with Disposable {
  final streamController = StreamController.broadcast();

  @override
  void dispose() {
    streamController.close();
    super.dispose();
  }
}

class DataRepository with Disposable {
  DataRepository({
    required this.localDataSource,
    required this.remoteDataSource,
  });

  @override
  List<Disposable> get disposables => [
        localDataSource,
        remoteDataSource,
      ];

  final LocalDataSource localDataSource;
  final RemoteDataSource remoteDataSource;
}

class DataUsecase with Disposable {
  DataUsecase({
    required this.repository,
  });

  @override
  List<Disposable> get disposables => [
        repository,
      ];

  final DataRepository repository;
}

通过以上示例,你可以看到如何在 Flutter 应用中使用 disposer 来管理和释放资源。希望这对你有所帮助!


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用disposer插件管理资源的示例代码。disposer插件主要用于自动管理资源释放,比如取消订阅、关闭文件句柄等,以确保应用在资源使用上更加高效和安全。

首先,确保你已经在pubspec.yaml文件中添加了disposer依赖:

dependencies:
  flutter:
    sdk: flutter
  disposer: ^x.y.z  # 请替换为最新版本号

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

接下来,下面是一个简单的示例,展示如何使用disposer来管理一个计时器的订阅:

import 'package:flutter/material.dart';
import 'package:disposer/disposer.dart';
import 'dart:async';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with DisposerMixin {
  late Timer _timer;
  int _counter = 0;

  @override
  void initState() {
    super.initState();

    // 创建一个每秒触发一次的Timer
    _timer = Timer.periodic(Duration(seconds: 1), (timer) {
      setState(() {
        _counter++;
      });
    });

    // 使用disposer管理Timer的取消
    disposer(() {
      _timer.cancel();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Disposer Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 当按钮被点击时,触发dispose流程
          Navigator.of(context).pop();
        },
        tooltip: 'Back',
        child: Icon(Icons.arrow_back),
      ),
    );
  }

  @override
  void dispose() {
    // 调用super.dispose()会自动触发disposer中注册的所有释放函数
    super.dispose();
  }
}

在这个示例中,我们做了以下几件事:

  1. 创建Timer:在initState方法中,我们创建了一个每秒触发一次的Timer,每次触发时更新_counter变量。
  2. 注册资源释放函数:使用disposer方法注册了一个匿名函数,这个函数会在dispose方法被调用时执行,用于取消Timer
  3. 管理资源释放:在dispose方法中,通过调用super.dispose()来自动触发所有通过disposer注册的资源释放函数。

这个示例展示了如何使用disposer来管理一个简单的Timer资源,但同样的方法可以应用于更复杂的资源管理场景,比如取消网络请求、关闭文件流等。

回到顶部