Flutter单次执行插件once的使用

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

Flutter单次执行插件once的使用

介绍

once 插件允许你在Flutter应用程序中以特定的时间间隔或条件运行代码或显示小部件一次。例如,用户应该只获得一次引导式游览、发布说明应该在每次新版本推出时仅弹出一次等。

Once 支持以下方法来控制代码或小部件的执行时间:

  • runOnce
  • runOnEveryNewVersion
  • runEvery12Hours
  • runHourly
  • runDaily
  • runOnNewDay
  • runWeekly
  • runMonthly
  • runOnNewMonth
  • runYearly
  • runCustom

对于小部件,它提供了类似的函数如 showOnce, showOnEveryNewVersion, showEvery12Hours 等。

使用示例

代码示例

import 'dart:math';

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

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

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

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String currentValue = 'Hello World';

  @override
  void initState() {
    // 在应用启动时运行一次
    Once.runOnce(
      'my-app-widget',
      callback: () => set('Once Started'),
    );

    // 在每个新版本运行
    Once.runOnEveryNewVersion(
      callback: () {
        /* What's new in 2.3.2 version? dialog */
      },
      fallback: () {
        /* Navigate to new screen */
      },
    );
    super.initState();
  }

  void set(String newOnce) => setState(
        () => currentValue = '$newOnce ${Random().nextInt(100)}',
      );

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primaryColor: Colors.deepPurple,
        primarySwatch: Colors.deepPurple,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Free Palestine 🇵🇸'),
        ),
        body: Center(
          child: SingleChildScrollView(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                // 每个新版本显示一次
                OnceWidget.showOnEveryNewVersion(
                  key: 'newVersionInfoDialog',
                  builder: () => const Text(
                    'Hey, It\'s a new app version, Smile!',
                  ),
                ),
                // 每次构建显示一次
                OnceWidget.showOnEveryNewBuild(
                  key: 'newBuildInfoDialog',
                  builder: () => const Text(
                    'Hey, It\'s a new app build, Smile!',
                  ),
                ),
                // 只显示一次的小部件
                OnceWidget.showOnce(
                  'onceWidget',
                  builder: () => const Text('Hey, I am the once widget'),
                  fallback: () => const Text('I am not the one'),
                ),
                // 每12小时显示一次的小部件
                OnceWidget.showEvery12Hours(
                  'widgetEvery12Hours',
                  builder: () => const Text('Hey, I am the every12Hours'),
                ),
                // 按钮触发的操作
                ElevatedButton(
                  child: const Text("Run On New Version"),
                  onPressed: () => Once.runOnEveryNewVersion(
                    callback: () => set("Hello New Version"),
                    fallback: () => set('Okay its not new version'),
                  ),
                ),
                ElevatedButton(
                  child: const Text("Run Hourly"),
                  onPressed: () => Once.runHourly(
                    "Hourly",
                    callback: () => set("Hello New Hour"),
                  ),
                ),
                ElevatedButton(
                  child: const Text("Run Every 12 Hour"),
                  onPressed: () => Once.runEvery12Hours(
                    "12 Hour",
                    callback: () => set("Hello New 12 Hour"),
                  ),
                ),
                ElevatedButton(
                  child: const Text("Run Daily"),
                  onPressed: () => Once.runDaily(
                    "Daily",
                    callback: () => set("Hello New Daily"),
                  ),
                ),
                ElevatedButton(
                  child: const Text("Run On New Month"),
                  onPressed: () => Once.runOnNewMonth(
                    "New Month",
                    callback: () => set("Hello New Month"),
                    fallback: () => set("Hello I am not new Month"),
                  ),
                ),
                ElevatedButton(
                  child: const Text("Run Monthly"),
                  onPressed: () => Once.runMonthly(
                    "Monthly x",
                    callback: () => set("Hello Monthly"),
                    fallback: () => set('Hello I am not Monthly'),
                  ),
                ),
                ElevatedButton(
                  child: const Text("Run Monthly Debug"),
                  onPressed: () => Once.runMonthly(
                    "Monthly debug",
                    callback: () => set("Hello Monthly (Debug)"),
                    fallback: () => set('Hello I am not Monthly (Debug)'),
                    debugCallback: true,
                  ),
                ),
                ElevatedButton(
                  child: const Text("Run Evert 5 Sec"),
                  onPressed: () => Once.runCustom(
                    "x",
                    duration: const Duration(seconds: 5),
                    callback: () => set("Hello New 5 Sec"),
                  ),
                ),
                const SizedBox(
                  height: 22,
                ),
                Text(
                  currentValue,
                  style: const TextStyle(
                    fontSize: 28,
                  ),
                  textAlign: TextAlign.center,
                )
              ],
            ),
          ),
        ),
      ),
    );
  }
}

详细说明

Once 方法

  • runOnce: 仅运行一次的回调。
  • runOnEveryNewVersion: 每次应用新版本时运行。
  • runEvery12Hours: 每12小时运行一次。
  • runHourly: 每小时运行一次。
  • runDaily: 每天运行一次。
  • runOnNewDay: 每天首次启动时运行。
  • runWeekly: 每周运行一次。
  • runMonthly: 每月运行一次。
  • runOnNewMonth: 每月首次启动时运行。
  • runYearly: 每年运行一次。
  • runCustom: 自定义间隔时间运行。

OnceWidget 方法

  • showOnce: 小部件仅显示一次。
  • showOnEveryNewVersion: 每次应用新版本时显示。
  • showEvery12Hours: 每12小时显示一次。
  • showHourly: 每小时显示一次。
  • showDaily: 每天显示一次。
  • showOnNewDay: 每天首次启动时显示。
  • showWeekly: 每周显示一次。
  • showMonthly: 每月显示一次。
  • showOnNewMonth: 每月首次启动时显示。
  • showYearly: 每年显示一次。
  • showCustom: 自定义间隔时间显示。

额外功能

  • clear: 删除特定键的 OnceOnceWidget 数据。
  • clearAll: 删除所有 OnceOnceWidget 数据。
  • debugCallbackdebugFallback: 用于调试回调和回退函数,在调试模式下有效。

通过这些方法和功能,你可以灵活地控制代码和小部件的执行频率,确保用户体验的一致性和优化。


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

1 回复

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


当然,以下是如何在Flutter项目中使用once插件的一个简单示例。once插件允许你执行某些代码块仅一次,这对于初始化任务或者只需要运行一次的操作非常有用。

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

dependencies:
  flutter:
    sdk: flutter
  once: ^3.0.0  # 请检查最新版本号

然后运行flutter pub get来获取依赖。

接下来,你可以在你的Dart代码中使用once插件。下面是一个示例,展示如何在Flutter应用中确保某个函数只运行一次:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Once Plugin Example'),
        ),
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  @override
  void initState() {
    super.initState();
    // 使用Once.runOnce确保下面的函数只运行一次
    Once.runOnce(
      key: 'unique_key_for_my_function',  // 提供一个唯一的key
      execute: () async {
        // 这里放置你只需要运行一次的代码
        print('This will only print once!');
        // 例如,进行网络请求、初始化设置等
        // await someInitializationFunction();
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () {
        // 尽管按钮可能被多次点击,但Once.runOnce确保下面的代码块只执行一次
        Once.runOnce(
          key: 'unique_key_for_button_press',
          execute: () {
            print('Button pressed only once!');
          },
        );
      },
      child: Text('Press Me'),
    );
  }
}

在这个示例中:

  1. Once.runOnce方法被用来确保某个代码块只运行一次。
  2. key参数是用来标识这个唯一的一次性任务的,你需要确保这个key在应用中是唯一的。
  3. execute参数是一个函数,包含了你需要只运行一次的代码。

当你运行这个应用并点击按钮时,你会看到控制台只打印一次“Button pressed only once!”,即使你多次点击按钮。同样地,在initState中定义的初始化代码也只会在应用启动时运行一次。

这样,通过使用once插件,你可以轻松管理那些只需要执行一次的任务,避免了重复执行带来的潜在问题。

回到顶部