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

Flutter应用SQLite转CSV上传Firebase时的警告问题求助

解决Flutter传感器数据处理中的三类警告问题

以下针对你遇到的三个警告分别给出具体解决方案:

1. App Check令牌获取失败警告

警告内容:W/StorageUtil: 获取App Check令牌失败,使用占位符令牌,错误:com.google.firebase.FirebaseException: No AppCheckProvider installed.
原因是Firebase App Check未配置,Storage SDK尝试获取安全令牌但找不到可用的验证提供者。

解决步骤:

  • 在pubspec.yaml中添加firebase_app_check依赖,执行flutter pub get更新包。
  • 在应用初始化代码中配置App Check,区分生产和调试环境:
    import 'package:firebase_app_check/firebase_app_check.dart';
    
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp();
      // 生产环境配置(Android用Play Integrity,iOS用App Attest)
      await FirebaseAppCheck.instance.activate(
        androidProvider: AndroidProvider.playIntegrity,
        appleProvider: AppleProvider.appAttest,
      );
      // 调试环境可替换为debug模式(仅用于测试)
      // await FirebaseAppCheck.instance.activate(
      //   androidProvider: AndroidProvider.debug,
      //   appleProvider: AppleProvider.debug,
      // );
      runApp(MyApp());
    }
    
  • 若暂时不需要App Check,可在Firebase控制台的Storage规则中临时关闭App Check验证(不推荐生产环境使用)。

2. StorageTask状态变更失败警告

警告内容:W/StorageTask: 无法将内部状态从INTERNAL_STATE_SUCCESS改为INTERNAL_STATE_CANCELED
问题出在上传任务完成后,代码中仍触发了取消操作,导致状态冲突。

解决步骤:

  • 检查_uploadToFirebase函数,确认是否在ref.putData执行完成后调用了cancel()方法,或是异步逻辑误触发了状态变更。
  • 用await等待上传任务完成,避免后续无效操作:
    Future<void> _uploadToFirebase(List<int> csvData) async {
      final storageRef = FirebaseStorage.instance.ref().child('sensor_data.csv');
      final uploadTask = storageRef.putData(Uint8List.fromList(csvData));
      
      // 等待上传完成,仅在成功后处理业务逻辑,不要调用cancel
      final snapshot = await uploadTask;
      if (snapshot.state == TaskState.success) {
        print('传感器数据上传完成');
        // 这里添加成功后的后续操作
      }
    }
    
  • 若传感器数据触发频率高,添加防抖逻辑,避免多个上传任务同时执行导致状态混乱。

3. SQLite数据库锁定警告

警告内容:I/flutter: 警告:数据库已锁定10秒,事务中需使用事务对象操作数据库
核心原因是事务中未使用事务对象执行数据库操作,或是并发访问导致锁等待超时。

解决步骤:

  • 修改_insertSensorData函数,确保插入、查询操作都通过事务对象执行,而非直接调用Database实例:
    Future<void> _insertSensorData(Map<String, dynamic> sensorData) async {
      final db = await _database;
      // 用事务包裹所有数据库操作
      await db.transaction((txn) async {
        // 使用txn.insert而非db.insert
        await txn.insert('sensor_table', sensorData);
        // 使用txn.query而非db.query
        final latestRecords = await txn.query(
          'sensor_table',
          orderBy: 'timestamp DESC',
          limit: 10,
        );
        // 转换为CSV并上传
        final csvData = _convertToCsv(latestRecords);
        await _uploadToFirebase(csvData);
      });
    }
    
  • 传感器数据属于高频写入场景,确保所有数据库操作都是异步执行,避免阻塞主线程;可考虑批量插入减少事务频繁开启。
  • 检查代码中其他数据库访问逻辑,确保没有绕过事务直接操作数据库的情况,避免锁冲突。

额外提示

当前功能正常但警告存在,可能隐藏潜在风险(比如数据库锁可能导致后续写入失败,App Check缺失在生产环境会降低安全性),建议按上述方案逐一修复。

内容的提问来源于stack exchange,提问作者Ahmed Youssef Alagha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:28:21