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

Flutter中如何在通知栏显示Firebase文件上传进度?

实现通知栏显示大文件上传进度及成功提示

1. 添加必要依赖

在pubspec.yaml中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_local_notifications: ^16.1.0
  firebase_storage: ^11.2.0
  firebase_core: ^2.15.0
  firebase_auth: ^4.10.0
  cloud_firestore: ^4.9.0
  image_picker: ^1.0.4

2. 初始化通知插件

在应用启动时初始化通知工具,可放在main函数或全局初始化逻辑中:

import 'package:flutter_local_notifications/flutter_local_notifications.dart';

FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

Future<void> initNotifications() async {
  // Android 初始化配置
  const AndroidInitializationSettings androidSettings =
      AndroidInitializationSettings('@mipmap/ic_launcher');
  
  // iOS 初始化配置
  const DarwinInitializationSettings iosSettings =
      DarwinInitializationSettings();
  
  const InitializationSettings initSettings =
      InitializationSettings(
    android: androidSettings,
    iOS: iosSettings,
  );
  
  await flutterLocalNotificationsPlugin.initialize(initSettings);
}

记得在main函数中调用await initNotifications();完成初始化。

3. 修改上传函数,监听进度并更新通知

重构uploadingFile函数,利用Firebase Storage的上传回调获取实时进度,同步更新通知栏:

Future<String> uploadingFile({required File uploadFile}) async {
  final storageRef = FirebaseStorage.instance.ref().child('banner_images/${DateTime.now().millisecondsSinceEpoch}.jpg');
  
  // 初始化进度通知配置
  final AndroidNotificationDetails progressAndroidDetails =
      AndroidNotificationDetails(
    'upload_progress_channel',
    '上传进度',
    channelDescription: '显示文件上传进度',
    importance: Importance.max,
    priority: Priority.high,
    onlyAlertOnce: true,
    showProgress: true,
    maxProgress: 100,
    progress: 0,
  );
  
  final NotificationDetails progressNotification =
      NotificationDetails(android: progressAndroidDetails);
  
  // 启动上传并监听进度
  final uploadTask = storageRef.putFile(uploadFile);
  
  uploadTask.snapshotEvents.listen((TaskSnapshot snapshot) {
    final progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
    final int progressInt = progress.toInt();
    
    // 更新通知进度
    flutterLocalNotificationsPlugin.show(
      0,
      '正在上传',
      '已完成 $progressInt%',
      progressNotification.copyWith(
        android: AndroidNotificationDetails(
          'upload_progress_channel',
          '上传进度',
          channelDescription: '显示文件上传进度',
          importance: Importance.max,
          priority: Priority.high,
          onlyAlertOnce: true,
          showProgress: true,
          maxProgress: 100,
          progress: progressInt,
        ),
      ),
    );
  });
  
  // 等待上传完成,获取下载链接
  final TaskSnapshot snapshot = await uploadTask;
  final String downloadUrl = await snapshot.ref.getDownloadURL();
  
  // 取消进度通知
  await flutterLocalNotificationsPlugin.cancel(0);
  
  return downloadUrl;
}

4. 修改原上传流程,添加上传成功通知

更新imageBannerPick函数,在Firestore数据更新完成后发送成功通知:

Future<bool> imageBannerPick(BuildContext context, ImageSource source) async {
  final pickedFile = await ImagePicker().pickImage(source: source);
  if (pickedFile == null) {
    return false;
  }
  File image = File(pickedFile.path);

  try {
    String uploadString = await uploadingFile(uploadFile: image);
    // 存储到Firestore
    await FirebaseFirestore.instance.collection('users').doc(FirebaseAuth.instance.currentUser?.uid).update({
      'backBannerPicture': uploadString,
    });
    
    // 发送上传成功通知
    const AndroidNotificationDetails successAndroidDetails =
        AndroidNotificationDetails(
      'upload_success_channel',
      '上传结果',
      channelDescription: '通知文件上传状态',
      importance: Importance.defaultImportance,
      priority: Priority.defaultPriority,
    );
    const NotificationDetails successNotification =
        NotificationDetails(android: successAndroidDetails);
    
    await flutterLocalNotificationsPlugin.show(
      1,
      '上传成功',
      '横幅图片已成功上传并更新',
      successNotification,
    );
    
    return true;
  } catch (e) {
    // 可选:添加上传失败通知
    const AndroidNotificationDetails failAndroidDetails =
        AndroidNotificationDetails(
      'upload_fail_channel',
      '上传结果',
      channelDescription: '通知文件上传状态',
      importance: Importance.defaultImportance,
      priority: Priority.defaultPriority,
    );
    const NotificationDetails failNotification =
        NotificationDetails(android: failAndroidDetails);
    
    await flutterLocalNotificationsPlugin.show(
      2,
      '上传失败',
      '横幅图片上传出错,请重试',
      failNotification,
    );
    
    return false;
  }
}

注意事项

  • Android端需确保应用拥有通知权限,flutter_local_notifications会自动创建通知渠道
  • iOS端需在Info.plist中添加权限描述:NSLocalNotificationUsageDescription和NSRemoteNotificationUsageDescription

内容的提问来源于stack exchange,提问作者Gbenga B Ayannuga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:55:18