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

本库提供了一个用于上传一张或多张图片到Firebase Storage的图片上传小部件。通过此库可以实现以下功能:
- 使用
PictureUploadWidget
上传一张或多张图片 - 通过
PictureUploadWidget
删除图片 - 多种自定义选项(字体大小、文本、颜色等)
- 可以自定义上传或下载方法
前提条件
重要:为了使用此库,您必须…
- 将Firebase添加到您的项目中,例如对于iOS,将您的GoogleService-Info.plist文件复制到ios/Runner/
- 配置iOS上的image_picker,详见:https://pub.dev/packages/image_picker
快速使用
如何使用PictureUploadWidget
的完整教程可以在以下链接找到:教程
总结:
- 应用上述前提条件到您的项目
- 请参阅示例了解使用方法:示例
示例
示例视频链接: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;
}
}
代码说明
-
导入必要的包:
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';
-
初始化Firebase:
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( 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
更多关于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.xml
和 Info.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.network
或 CachedNetworkImage
来显示上传的图片。
Image.network(imageUrl);