Flutter单次执行任务插件run_once的使用

Flutter单次执行任务插件run_once的使用

run_once

一个极简单的库,用于仅执行一次的任务。无论该任务被调用多少次。

如何工作?

很简单。我们基本上使用StackTrace.current并仔细地利用这一点来记录函数何时被调用。这意味着调用堆栈实际上被用作函数何时及何处被调用的唯一标识符。

理论依据

这个库可以被认为是一种反模式,并且是一个小练习,但想象一下在Flutter的StatefulWidget中,其build方法可能不会只在你调用setState时才被调用。在这种情况下,你可以使用runOnce在该小部件的生命周期内仅运行一次。

值得一提的是,package:async中也有一个AsyncMemoizer.runOnce用于异步函数,但它并不了解调用堆栈,并以更简单的方式内部工作。

使用方法

纯 Dart 示例

import 'package:run_once/run_once.dart';

void main() async {
  /// 这将打印 'called 1' 恰好一次,尽管我们调用了该函数10次。
  for (var i = 0; i < 10; i++) {
    runOnce(() {
      print('called 1');
    });
  }

  /// 这将打印 'called 2' 恰好两次,因为 `[runOnce]` 并没有在同一个位置被调用。
  runOnce(() {
    print('called 2');
  });
  runOnce(() {
    print('called 2');
  });

  /// 这将打印 'called 3' 恰好三次,尽管我们调用了该函数15次。
  /// 注意 `forDuration` 是一个持续时间为500毫秒的 `[Duration]`。
  /// 使用 `forDuration` 表示在500毫秒内 `[runOnce]` 只能运行一次。
  /// 因此我们在循环中循环15次,并在每个循环周期中等待100毫秒;因此 'called 3' 将恰好打印3次。
  for (var i = 0; i < 15; i++) {
    await Future.delayed(Duration(milliseconds: 100));

    runOnce(() {
      print('called 3');
    }, forDuration: Duration(milliseconds: 500));
  }
}

Flutter 示例(使用StatefulWidget

import 'package:run_once/run_once.dart';

// 这个例子使用了state_notifier包
class _SomeWidgetState extends State<SomeWidget> {
  [@override](/user/override)
  void dispose() {
    /// 当此方法被调用时,[runOnce]将能够再次为该类运行一次。
    runOnceDestroy();
    
    super.dispose();
  }
  
  [@override](/user/override)
  Widget build(BuildContext context) {
    final state = context.watch<MyState>();
    
    return state.when(
      data: () => Placeholder(),
      finished: () {
        runOnce(() {
          /// 这里总是只调用一次,
          /// 直到 `dispose` 被调用。
          Navigator.pushNamed(context, '/b');
        });

        return Placeholder();
      },
    );
  }  
}

更多关于Flutter单次执行任务插件run_once的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter单次执行任务插件run_once的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


run_once 是一个 Flutter 插件,用于确保某个任务在应用的生命周期内只执行一次。这对于需要在应用启动时执行某些初始化操作,但又不希望这些操作在每次应用启动时都重复执行的场景非常有用。

安装插件

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

dependencies:
  flutter:
    sdk: flutter
  run_once: ^1.0.0

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

使用插件

run_once 插件的使用非常简单。你只需要调用 RunOnce.runOnce 方法,并传入一个唯一的标识符和一个回调函数。回调函数中的代码只会在第一次调用时执行。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('RunOnce Example'),
        ),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  void initState() {
    super.initState();
    _initializeApp();
  }

  void _initializeApp() {
    RunOnce.runOnce('my_unique_key', () {
      // 这里的代码只会在第一次调用时执行
      print('This code runs only once!');
      // 你可以在这里执行一些初始化操作,例如加载配置、初始化数据库等
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Text('Check the console for the run once message.');
  }
}
回到顶部