Flutter单次执行插件once的使用
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: 删除特定键的
Once
或OnceWidget
数据。 - clearAll: 删除所有
Once
和OnceWidget
数据。 - debugCallback 和 debugFallback: 用于调试回调和回退函数,在调试模式下有效。
通过这些方法和功能,你可以灵活地控制代码和小部件的执行频率,确保用户体验的一致性和优化。
更多关于Flutter单次执行插件once的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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'),
);
}
}
在这个示例中:
Once.runOnce
方法被用来确保某个代码块只运行一次。key
参数是用来标识这个唯一的一次性任务的,你需要确保这个key在应用中是唯一的。execute
参数是一个函数,包含了你需要只运行一次的代码。
当你运行这个应用并点击按钮时,你会看到控制台只打印一次“Button pressed only once!”,即使你多次点击按钮。同样地,在initState
中定义的初始化代码也只会在应用启动时运行一次。
这样,通过使用once
插件,你可以轻松管理那些只需要执行一次的任务,避免了重复执行带来的潜在问题。