首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Flutter: Firebase存储下载url

Flutter: Firebase存储下载url
EN

Stack Overflow用户
提问于 2020-05-15 20:57:35
回答 2查看 815关注 0票数 0

我是Flutter的新手,我正在尝试制作一个墙纸应用程序,我使用Firebase来存储我的图像。该应用程序从Firebase检索图像,用户可以将图像共享并下载到设备上。我正在使用image_gallery_saver包,但我无法获得图片的url,所以我可以将其添加到image_gallery_saver函数中,有没有一种简单的方法可以在用户点击特定图片后从firebase获取图片的url?

以下是主页:

代码语言:javascript
代码运行次数:0
运行
复制
import 'package:cardstest2/Screens/ImageScreen.dart';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'dart:async';




class FirestoreListViewPage extends StatefulWidget {
  @override
  _FirestoreListViewPageState createState() => _FirestoreListViewPageState();
}

class _FirestoreListViewPageState extends State<FirestoreListViewPage> {

  Future _data;

  Future getPosts() async {
    var firestore = Firestore.instance;
    QuerySnapshot qn = await firestore.collection("gallery").getDocuments();
    return qn.documents;
  }


  @override
  void initState() {
    super.initState();

    _data = getPosts();
  }


  @override
  Widget build(BuildContext context) {

    return new Scaffold(
      appBar: new AppBar(
        title: Text('Subcategories'),
      ),
      body: Container(
        child: FutureBuilder(
            future: _data,
            builder: (_, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return Center(
                  child: Text('Waiting...'),
                );
              } else {

                return ListView.builder(
                    itemCount: snapshot.data.length,
                    itemBuilder: (_, index){

                      return Card(
                        child: ListTile(
                          title: Image.network(snapshot.data[index].data['GalleryUrl']),
                          onTap: () {
                            Navigator.of(context).push(
                              MaterialPageRoute(
                                builder: (context) => imageScreenPage(snapshot.data[index].data['GalleryUrl']),
                              ),
                            );
                          },
                        ),
                      );

                    });

              }
            }),
      ),
    );
  }
}

以下是imageScreen页面:

代码语言:javascript
代码运行次数:0
运行
复制
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:share/share.dart';
import 'package:dio/dio.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'dart:ui';



class imageScreenPage extends StatefulWidget {
  String cardPath;

  imageScreenPage(this.cardPath);

  @override
  _imageScreenPageState createState() => _imageScreenPageState();
}

class _imageScreenPageState extends State<imageScreenPage> {

  final LinearGradient backgroundGradient = new LinearGradient(
      colors: [new Color(0x10000000), new Color(0x30000000)],
      begin: Alignment.topLeft,
      end: Alignment.bottomRight);


  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new SizedBox.expand(
        child: new Container(
          decoration: new BoxDecoration(gradient: backgroundGradient),
          child: new Stack(
            children: <Widget>[
              new Align(
                alignment: Alignment.center,
                child: new Hero(
                  tag: widget.cardPath,
                  child: new Image.network(widget.cardPath),

                ),

              ),
              new Align(
                alignment: Alignment.topCenter,
                child: new Column(
                  mainAxisAlignment: MainAxisAlignment.start,
                  mainAxisSize: MainAxisSize.min,
                  children: <Widget>[
                    new AppBar(
                      elevation: 0.0,
                      backgroundColor: Colors.transparent,
                      leading: new IconButton(
                          icon: new Icon(
                            Icons.close,
                            color: Colors.black,
                          ),
                          onPressed: () => Navigator.of(context).pop()),
                    )
                  ],
                ),
              ),


            ],
          ),

        ),
      ),


      persistentFooterButtons: <Widget>[
        IconButton(
          icon: Icon(Icons.wallpaper), onPressed: () {},
        ),
        IconButton(
          icon: Icon(Icons.file_download), onPressed: () {_save();},
        ),
        IconButton(
          icon: Icon(Icons.share), onPressed: () {Share.share(widget.cardPath);},
        ),
      ],

    );
  }

  _save() async {
    var response = await Dio().get("<insert url>", options: Options(responseType: ResponseType.bytes));
    final result = await ImageGallerySaver.saveImage(Uint8List.fromList(response.data));
    print(result);
  }



}
EN

回答 2

Stack Overflow用户

发布于 2020-05-15 21:04:37

要获取downloadUrl,请执行以下操作:

代码语言:javascript
代码运行次数:0
运行
复制
          StorageTaskSnapshot snapshot = await storage
              .ref()
              .child("images/$imageName")
              .putFile(file)
              .onComplete;
          if (snapshot.error == null) {
            final String downloadUrl =
                await snapshot.ref.getDownloadURL();
              }

使用putFile将文件添加到Firebase存储,然后您可以使用snapshot.ref.getDownloadURL()获取url。

票数 1
EN

Stack Overflow用户

发布于 2021-06-15 06:37:44

2021年所有使用flutter的人

这对我很有效

代码语言:javascript
代码运行次数:0
运行
复制
    import 'package:firebase_storage/firebase_storage.dart' as firebase_storage;

    Future<String> uploadImage(imageFile) async {
    firebase_storage.Reference ref = storage.ref().child('post_$postId.jpg');
    firebase_storage.UploadTask uploadTask = ref.putFile(imageFile);
    print('File Uploaded');
    var imageUrl = await (await uploadTask).ref.getDownloadURL();
    String url = imageUrl.toString();
    return url;
  }

uploadImage()是一个接受imageFile的函数

您必须在异步函数中使用await uploadImage(imageFile)来调用它

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61819801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档