Flutter确保初始化插件ensure_initialized的使用

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

Flutter确保初始化插件ensure_initialized的使用

ensure_initialized 是一个Flutter包,用于确保对象在使用前已经完成初始化。这个包特别适用于需要进行耗时初始化的对象。以下是该包的基本用法和示例代码。

用法

添加Mixin到类中

首先,将 EnsureInitializedMixinEnsureInitializedResultMixin<T> 添加到你的类中:

class YourObject with EnsureInitializedMixin {
  // 类的具体实现
}

等待初始化完成

你可以通过 await object.ensureInitialized 来等待对象完成初始化:

final object = YourObject();

await object.ensureInitialized;

object.doSomethingAfterItIsReady();

如果你的初始化有返回值,可以使用 EnsureInitializedResultMixin<T>

class YourObjectWithResult with EnsureInitializedResultMixin<int> {
  // 类的具体实现
}

final objectWithResult = YourObjectWithResult();

final result = await objectWithResult.ensureInitialized;

print(result);

检查是否已初始化

你可以通过 isInitialized 属性来检查对象是否已完成初始化:

final object = YourObject();

print(object.isInitialized); // false

await object.init(); // 调用初始化方法

print(object.isInitialized); // true

成功初始化

调用 initializedSuccessfully() 方法表示初始化成功:

Future<void> init() async {
  await Future.delayed(const Duration(seconds: 3));
  
  initializedSuccessfully();
}

如果有返回值,传递相应类型的值:

initializedSuccessfully(5);

初始化失败

如果初始化失败,调用 initializedWithError 方法:

Future<void> init() async {
  try {
    await Future.delayed(const Duration(seconds: 3));
    
    initializedSuccessfully();
  } on Exception catch (e, s) {
    initializedWithError(error: e, stackTrace: s);
  }
}

流处理

whenInitializedwhenUninitialized 可以用来监听对象的初始化状态变化:

object.whenInitialized.listen((_) {
  print('My object was initialized!');
});

重新初始化

可以通过 markAsUninitialized() 方法标记对象为未初始化状态:

class UserService with EnsureInitializedMixin {
  Future signIn(credentials) async {
    // 登录逻辑
    
    initializedSuccessfully();
  }
  
  Future signOut() async {
    // 登出逻辑
    
    markAsUninitialized();
  }
}

示例代码

以下是一个完整的示例代码,展示了如何使用 ensure_initialized 包:

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

Future main(List<String> args) async {
  print('=== W/O Result ===\n');
  final heavyInitialComputations = HeavyInitialComputations();

  heavyInitialComputations.whenInitialized.listen(
    (_) {
      print('\nWhen Initialized is Fired!\n');
    },
  );

  try {
    print('Calling doSomething ...');

    final data = await heavyInitialComputations.doSomething();

    print('doSomething result: $data');
  } on Exception catch (e, s) {
    print('Unable to do something');
    print(e);
    print(s);
  }

  await Future.delayed(Duration(milliseconds: 500));

  print('\n=== W/ Result ===\n');

  final heavyInitialComputationsResult = HeavyInitialComputationsResult();
  heavyInitialComputationsResult.whenInitialized.listen(
    (result) {
      print('\nWhen Initialized with result is Fired! The result is: $result\n');
    },
  );

  try {
    print('Calling doSomething ...');

    final data = await heavyInitialComputationsResult.doSomething();

    print('doSomething result: $data');
  } on Exception catch (e, s) {
    print('Unable to do something');
    print(e);
    print(s);
  }
}

class HeavyInitialComputations with EnsureInitializedMixin {
  HeavyInitialComputations() {
    _init();
  }

  Future<void> _heavyComputations() async {
    await Future.delayed(const Duration(seconds: 3));
  }

  Future<void> _init() async {
    try {
      await _heavyComputations();
      initializedSuccessfully();
    } on Exception catch (e, s) {
      initializedWithError(error: e, stackTrace: s);
    }
  }

  Future<int> doSomething() async {
    await ensureInitialized;
    return 25;
  }
}

class HeavyInitialComputationsResult with EnsureInitializedResultMixin<String> {
  HeavyInitialComputationsResult() {
    _init();
  }

  Future<String> _heavyComputations() async {
    await Future.delayed(const Duration(seconds: 3));
    return 'I am initialized!';
  }

  Future<void> _init() async {
    try {
      final result = await _heavyComputations();
      initializedSuccessfully(result);
    } on Exception catch (e, s) {
      initializedWithError(error: e, stackTrace: s);
    }
  }

  Future<String> doSomething() async {
    final initResult = await ensureInitialized;
    return 'Upper cased: ${initResult.toUpperCase()}';
  }
}

以上示例展示了如何在Flutter应用中使用 ensure_initialized 包来确保对象在使用前已经完成初始化,并且能够处理初始化成功和失败的情况。


更多关于Flutter确保初始化插件ensure_initialized的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter确保初始化插件ensure_initialized的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,ensure_initialized 是一种确保插件在需要之前已经被正确初始化的方法。这通常在插件需要在应用的多个部分中使用,或者在应用启动时就需要被初始化时非常有用。虽然 Flutter 的一些插件会自动初始化,但一些插件可能需要在使用前显式调用初始化方法。

以下是一个如何在 Flutter 应用中使用 ensure_initialized 的示例,假设我们有一个需要初始化的插件,比如 example_plugin

1. 添加插件依赖

首先,你需要在 pubspec.yaml 文件中添加插件依赖。这里我们假设插件名为 example_plugin

dependencies:
  flutter:
    sdk: flutter
  example_plugin: ^x.y.z  # 使用实际的插件版本号

2. 导入插件

在你的 Dart 文件中导入插件:

import 'package:example_plugin/example_plugin.dart';

3. 初始化插件

在你的应用启动代码中(通常是 main.dart 文件中的 main 函数),调用 ensure_initialized 方法来初始化插件。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();  // 确保 Flutter 绑定已经初始化
  await ExamplePlugin.ensureInitialized();     // 初始化插件

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have successfully initialized the example_plugin!',
            ),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 异步操作ensure_initialized 通常是异步操作,因此需要使用 await 关键字等待其完成。这就是为什么在 main 函数中使用了 async 关键字。
  2. 插件文档:不同的插件可能有不同的初始化方法。始终参考插件的官方文档来了解正确的初始化方式。
  3. 错误处理:在实际应用中,你可能还需要添加错误处理逻辑,以处理插件初始化失败的情况。

这个示例展示了如何在 Flutter 应用启动时初始化一个插件。根据你的具体插件和应用需求,你可能需要调整代码。

回到顶部