Flutter中如何避免部分代码在热重启时重复执行?
解决Flutter Dropbox客户端热重启重复初始化崩溃问题
核心思路
热重启会重置内存中的全局变量,但不会清除设备本地存储。因此可以通过持久化标记来记录初始化状态,避免重复执行初始化代码。
具体实现(SharedPreferences方案)
这是最稳妥的跨平台方案,支持iOS、Android及Web:
- 添加依赖
在pubspec.yaml中引入SharedPreferences包:
dependencies: shared_preferences: ^2.2.2 # 可替换为最新版本
- 修改初始化逻辑
将初始化代码包裹在持久化标记的判断中:
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_dropbox/flutter_dropbox.dart'; Future<void> main() async { // 必须先初始化Flutter绑定才能调用SharedPreferences WidgetsFlutterBinding.ensureInitialized(); final prefs = await SharedPreferences.getInstance(); const initFlagKey = 'dropbox_init_done'; // 仅当标记不存在或为false时执行初始化 if (!(prefs.getBool(initFlagKey) ?? false)) { // 这里放你的Dropbox初始化代码 await FlutterDropbox.initialize( clientId: '你的客户端ID', // 其他配置参数 ); // 标记初始化完成 await prefs.setBool(initFlagKey, true); } runApp(const MyApp()); }
调试时重置初始化状态
如果开发中需要重新执行初始化,可以临时添加一行代码手动清除标记:
// 调试用:清除初始化标记 // await prefs.setBool(initFlagKey, false);
进阶优化(适配版本更新)
如果后续应用版本更新需要重新初始化Dropbox,可以结合应用版本号来判断:
import 'package:package_info_plus/package_info_plus.dart'; // ... 其他代码 final packageInfo = await PackageInfo.fromPackageInfo(); final currentVersion = packageInfo.version; const versionKey = 'dropbox_init_version'; if (prefs.getString(versionKey) != currentVersion) { // 执行初始化或更新操作 await FlutterDropbox.initialize(/* 参数 */); await prefs.setString(versionKey, currentVersion); }
内容的提问来源于stack exchange,提问作者Avdept
相关产品推荐
相关产品推荐

