You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何避免部分代码在热重启时重复执行?

解决Flutter Dropbox客户端热重启重复初始化崩溃问题

核心思路

热重启会重置内存中的全局变量,但不会清除设备本地存储。因此可以通过持久化标记来记录初始化状态,避免重复执行初始化代码。

具体实现(SharedPreferences方案)

这是最稳妥的跨平台方案,支持iOS、Android及Web:

  1. 添加依赖
    在pubspec.yaml中引入SharedPreferences包:
dependencies:
  shared_preferences: ^2.2.2 # 可替换为最新版本
  1. 修改初始化逻辑
    将初始化代码包裹在持久化标记的判断中:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:47:18