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

如何判断向Firebase Storage上传媒体时是否无网络连接?

解决Firebase Storage无网络时不返回错误的问题

Firebase Storage默认会缓存上传任务并在网络恢复时自动重试,所以无网络场景下不会立刻抛出错误。要实现无网络时更新UI状态,你可以从主动检测网络状态和监听上传任务状态两个方向入手:

1. 上传前主动检测网络状态

借助connectivity_plus包先判断当前网络连通性,无网络时直接更新UI,避免触发无效上传操作:

import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'dart:typed_data';

// 检查当前是否有网络连接
Future<bool> isNetworkAvailable() async {
  final connectivityResult = await Connectivity().checkConnectivity();
  return connectivityResult != ConnectivityResult.none;
}

// 执行上传逻辑
void startUpload(Uint8List data) async {
  final hasNetwork = await isNetworkAvailable();
  if (!hasNetwork) {
    // 无网络,直接更新UI状态
    _updateUIForOffline();
    return;
  }

  // 有网络时发起上传
  FirebaseStorage.instance.ref('fo').putData(data).then((_) {
    // 上传成功更新UI
    _updateUIForSuccess();
  }).catchError((error) {
    // 处理上传失败的其他错误
    _updateUIForError(error);
  });
}

// 示例UI更新方法
void _updateUIForOffline() {
  // 比如显示"无网络连接,请稍后重试"
}

void _updateUIForSuccess() {
  // 比如显示"上传完成"
}

void _updateUIForError(dynamic error) {
  // 比如显示错误信息
}

2. 上传过程中监听网络与任务状态

如果需要在上传中途网络断开时也能触发UI更新,可以同时监听网络状态变化和上传任务的状态流转:

void uploadWithNetworkMonitoring(Uint8List data) {
  final uploadTask = FirebaseStorage.instance.ref('fo').putData(data);
  StreamSubscription? networkSubscription;

  // 监听上传任务的状态变化
  final taskSubscription = uploadTask.snapshotEvents.listen((snapshot) {
    switch (snapshot.state) {
      case TaskState.running:
        // 上传中,启动网络监听
        networkSubscription ??= Connectivity().onConnectivityChanged.listen((result) {
          if (result == ConnectivityResult.none) {
            // 网络断开,更新UI并可选择取消任务
            _updateUIForOffline();
            uploadTask.cancel();
            networkSubscription?.cancel();
          }
        });
        break;
      case TaskState.success:
        _updateUIForSuccess();
        networkSubscription?.cancel();
        break;
      case TaskState.error:
        _updateUIForError(snapshot.error);
        networkSubscription?.cancel();
        break;
      default:
        break;
    }
  });
}

补充说明

  • 若需要调整Firebase的离线重试策略,可以通过配置UploadTask的自定义元数据或修改重试参数,但提前检测网络是更直接的解决方案。
  • 确保在Android的AndroidManifest.xml和iOS的Info.plist中配置好网络权限,保证网络状态检测功能正常运行。

内容的提问来源于stack exchange,提问作者Mohammed Hamdan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:42:43