Flutter云存储图片上传插件firestore_picture_uploader的使用

Flutter云存储图片上传插件firestore_picture_uploader的使用

本库提供了一个用于上传一张或多张图片到Firebase Storage的图片上传小部件。通过此库可以实现以下功能:

  • 使用PictureUploadWidget上传一张或多张图片
  • 通过PictureUploadWidget删除图片
  • 多种自定义选项(字体大小、文本、颜色等)
  • 可以自定义上传或下载方法

前提条件

重要:为了使用此库,您必须…

  1. 将Firebase添加到您的项目中,例如对于iOS,将您的GoogleService-Info.plist文件复制到ios/Runner/
  2. 配置iOS上的image_picker,详见:https://pub.dev/packages/image_picker

快速使用

如何使用PictureUploadWidget的完整教程可以在以下链接找到:教程

总结:

  1. 应用上述前提条件到您的项目
  2. 请参阅示例了解使用方法:示例

示例

示例视频链接:https://github.com/Rodiii/flutter_firebase_picture_uploader/raw/master/example.gif

示例代码

import 'package:firestore_picture_uploader/firestore_picture_uploader.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:firebase_core/firebase_core.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();

  runApp(ExampleApp());
}

class ExampleApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: MyHome(),
    );
  }
}

class MyHome extends StatefulWidget {
  @override
  _MyHomeState createState() => new _MyHomeState();
}

class _MyHomeState extends State<MyHome> {
  List<UploadJob>? _profilePictures = [];

  @override
  Widget build(BuildContext context) {
    final profilePictureTile = new Material(
      color: Colors.transparent,
      child: new Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          const Text('Profile Picture',
              style: TextStyle(
                color: CupertinoColors.systemBlue,
                fontSize: 15.0,
              )),
          const Padding(
            padding: EdgeInsets.only(bottom: 5.0),
          ),
          PictureUploadWidget(
            initialImages: _profilePictures,
            onPicturesChange: profilePictureCallback,
            buttonStyle: PictureUploadButtonStyle(),
            buttonText: '上传图片',
            localization: PictureUploadLocalization(),
            settings: PictureUploadSettings(
                // customDeleteFunction: ProfileController.deleteProfilePicture,
                // customUploadFunction: RecipeController.uploadRecipePicture,
                imageSource: ImageSourceExtended.askUser,
                minImageCount: 0,
                maxImageCount: 5,
                imageManipulationSettings: const ImageManipulationSettings(
                    enableCropping: true, compressQuality: 75)),
            enabled: true,
          ),
        ],
      ),
    );

    return new Scaffold(
      body: Padding(
          padding: const EdgeInsets.fromLTRB(20, 100, 20, 50),
          child: Column(children: <Widget>[profilePictureTile])),
    );
  }

  void profilePictureCallback(
      {List<UploadJob>? uploadJobs, bool? pictureUploadProcessing}) {
    _profilePictures = uploadJobs;
  }
}

代码说明

  1. 导入必要的包

    import 'package:firestore_picture_uploader/firestore_picture_uploader.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter/cupertino.dart';
    import 'package:firebase_core/firebase_core.dart';
    
  2. 初始化Firebase

    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
    
      await Firebase.initializeApp();
    
      runApp(ExampleApp());
    }
    
  3. 创建应用入口

    class ExampleApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          home: MyHome(),
        );
      }
    }
    
  4. 创建主页面状态类

    class MyHome extends StatefulWidget {
      @override
      _MyHomeState createState() => new _MyHomeState();
    }
    
  5. 实现主页面状态

    class _MyHomeState extends State<MyHome> {
      List<UploadJob>? _profilePictures = [];
    
      @override
      Widget build(BuildContext context) {
        final profilePictureTile = new Material(
          color: Colors.transparent,
          child: new Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              const Text('Profile Picture',
                  style: TextStyle(
                    color: CupertinoColors.systemBlue,
                    fontSize: 15.0,
                  )),
              const Padding(
                padding: EdgeInsets.only(bottom: 5.0),
              ),
              PictureUploadWidget(
                initialImages: _profilePictures,
                onPicturesChange: profilePictureCallback,
                buttonStyle: PictureUploadButtonStyle(),
                buttonText: '上传图片',
                localization: PictureUploadLocalization(),
                settings: PictureUploadSettings(
                    imageSource: ImageSourceExtended.askUser,
                    minImageCount: 0,
                    maxImageCount: 5,
                    imageManipulationSettings: const ImageManipulationSettings(
                        enableCropping: true, compressQuality: 75)),
                enabled: true,
              ),
            ],
          ),
        );
    
        return new Scaffold(
          body: Padding(
              padding: const EdgeInsets.fromLTRB(20, 100, 20, 50),
              child: Column(children: <Widget>[profilePictureTile])),
        );
      }
    
      void profilePictureCallback(
          {List<UploadJob>? uploadJobs, bool? pictureUploadProcessing}) {
        _profilePictures = uploadJobs;
      }
    }
    

更多关于Flutter云存储图片上传插件firestore_picture_uploader的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter云存储图片上传插件firestore_picture_uploader的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


firestore_picture_uploader 是一个用于在 Flutter 应用中上传图片到 Firebase Cloud Storage 的插件。它简化了图片上传的流程,并允许你在上传完成后将图片的 URL 存储到 Firestore 中。以下是如何使用 firestore_picture_uploader 插件的详细步骤:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 firestore_picture_uploader 依赖:

dependencies:
  flutter:
    sdk: flutter
  firebase_core: latest_version
  firebase_storage: latest_version
  cloud_firestore: latest_version
  firestore_picture_uploader: latest_version

然后运行 flutter pub get 来安装这些依赖。

2. 初始化 Firebase

在你的 main.dart 文件中初始化 Firebase:

import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Firestore Picture Uploader',
      home: PictureUploadScreen(),
    );
  }
}

3. 使用 FirestorePictureUploader

在你的 PictureUploadScreen 中,使用 FirestorePictureUploader 组件来上传图片并将其 URL 存储到 Firestore 中。

import 'package:flutter/material.dart';
import 'package:firestore_picture_uploader/firestore_picture_uploader.dart';

class PictureUploadScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Upload Picture'),
      ),
      body: Center(
        child: FirestorePictureUploader(
          storagePath: 'user_profiles',
          firestoreCollection: 'users',
          firestoreField: 'profile_picture',
          onUploadComplete: (String imageUrl) {
            print('Image uploaded successfully: $imageUrl');
          },
          onUploadFailed: (String error) {
            print('Failed to upload image: $error');
          },
          child: Icon(Icons.camera_alt, size: 50),
        ),
      ),
    );
  }
}

4. 解释参数

  • storagePath:指定图片在 Firebase Storage 中的存储路径。例如,'user_profiles' 会将图片存储在 user_profiles 文件夹下。
  • firestoreCollection:指定要将图片 URL 存储到的 Firestore 集合名称。例如,'users' 表示将图片 URL 存储在 users 集合中。
  • firestoreField:指定要将图片 URL 存储到的字段名称。例如,'profile_picture' 表示将图片 URL 存储在 profile_picture 字段中。
  • onUploadComplete:图片上传成功后的回调函数,返回图片的 URL。
  • onUploadFailed:图片上传失败时的回调函数,返回错误信息。
  • child:指定一个按钮或图标作为上传触发组件。

5. 处理权限

确保在 AndroidManifest.xmlInfo.plist 中添加必要的权限来访问设备的相机和存储。

6. 运行应用

现在你可以运行应用,点击上传按钮选择图片,图片将上传到 Firebase Storage,并且其 URL 将存储在 Firestore 中。

7. 访问 Firestore 中的图片 URL

你可以在 Firestore 的 users 集合中查看上传图片的 URL,并使用该 URL 在应用中显示图片。

import 'package:cloud_firestore/cloud_firestore.dart';

Future<String> getProfilePictureUrl(String userId) async {
  DocumentSnapshot userDoc = await FirebaseFirestore.instance.collection('users').doc(userId).get();
  return userDoc['profile_picture'];
}

8. 显示图片

使用 Image.networkCachedNetworkImage 来显示上传的图片。

Image.network(imageUrl);
回到顶部