【问题标题】:Displaying image in container using Firebase storage in Flutter?在 Flutter 中使用 Firebase 存储在容器中显示图像?
【发布时间】:2021-06-23 01:24:43
【问题描述】:

我是 Firebase 的新手,现在不知道如何继续前进。我在 Firebase 存储中有一张图片,我只想在我的应用中显示它。全尺寸,所以我选择了Container。现在通过观看教程,我编写了一些代码,但没有得到任何结果。请大家帮忙。 这可能是一个愚蠢的问题,但你知道初学者!先感谢您。???? 我已经使用 StreamBuilder 通过代码进行了更新。

**MAIN.DART**

void main() {
runApp(MyApp());
}

class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
  title: 'Flutter Demo',
  theme: ThemeData(
    primarySwatch: Colors.blue,
  ),
  home: DetailScreen(),
);
}
}

**DETAILSCREEN.DART

 class DetailScreen extends StatefulWidget {
 @override
_DetailScreenState createState() => _DetailScreenState();
 }

 class _DetailScreenState extends State<DetailScreen> {

 StreamSubscription<QuerySnapshot> subscription;
 List<DocumentSnapshot> wallpaperList;
 final CollectionReference collectionReference =
  FirebaseFirestore.instance.collection("wallpaperimg");

 @override
 void initState() {
  super.initState();
   subscription = collectionReference.snapshots().listen((datasnapshot) {
   setState(() {
    wallpaperList = datasnapshot.docs;
  });
});
  }

 @override
 void dispose() {
  subscription?.cancel();
 super.dispose();
 }

@override
Widget build(BuildContext context) {
 return return StreamBuilder(
    stream: FirebaseFirestore.instance
        .collection("wallpaperimg")
        .doc()
        .snapshots(),
    builder: (context, snapshot) {
      if (!snapshot.hasData) {
        return Text("Loading");
      }
      var profiledetail = snapshot.data;
      return Container(
          child: Image(image: NetworkImage(profiledetail['imgUrl'])));
    });
      }
   }

【问题讨论】:

    标签: firebase flutter firebase-storage


    【解决方案1】:

    这是假设 firebase 中的每个文档都存储一个 imageUrl。

    要显示列表中的第一张图片,您可以使用:

    Container(
     child: Image.network(wallpaperList[0].data()['imageUrl'])
    )
    

    但由于您要检索多个文档,而不仅仅是一个,您可以使用 ListView.builder 来显示您获取的所有图像。

    ListView.builder(
    itemCount: wallpaperList.length,
    itemBuilder: (context, index) {
     return Container(
     child: Image.network(wallpaperList[index].data()['imageUrl'])
    );})
    

    发布您的数据在 Firebase 中的外观,以获得更好的答案。

    -- 编辑 2: 由于您现在使用的是 streambuilder,因此您需要将文档 ID 传递给您的查询.collection('wallpaperimg').doc('theRandomNumberDocumentIdinfirebase').get()

    【讨论】:

    • 我已经发布了数据你可以看看!
    • @YashJha 我更新了我的答案,您需要添加['imageUrl'] 才能访问该网址。立即尝试它应该可以工作。
    • @YashJha 你得到的错误是因为你没有将 documentId 传递给 firebase,所以它不知道去哪里找。在 .doc() 中,您应该传递文档的 id,然后它应该可以正常工作。更新他的结果。
    • 成功了!!!!太感谢了。真的很感激。
    • 不客气@YashJha。请将其标记为您帖子的解决方案,并为有用的 cmets 投票,因为该帖子包含多个问题,我将不胜感激。编码愉快!
    【解决方案2】:

    像这样使用保存图像的流。

    StreamBuilder(

                  stream: Firestore.instance
                      .collection("userprofile")
                      .document(userid)
                      .snapshots(),
                  builder: (context, snapshot) {
                    if (!snapshot.hasData) {
                      return Text("Loading");
                    }  var  Profiledetail = snapshot.data;return    Container(child:Image(image:NetworkImage(Profiledetail["imgurl"])));
    

    我希望这会有所帮助

    【讨论】:

    • 这看起来很接近,我这样做了,在一些 multidex 和 firebase 初始化错误(我解决了)之后,我现在面临另一个问题 Bad state: cannot get a field on a DocumentSnapshotPlatform which does not exist 知道如何解决这个问题吗?跨度>
    • 我认为 streambuilder 导致了一些错误,它显示类似于the relevant error-causing widget was StreamBuilder&lt;DocumentSnapshot&gt;
    • 你不需要提供 doc() 因为你提供了随机的文档 id
    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 2020-09-25
    • 2021-07-18
    • 1970-01-01
    • 2021-10-26
    • 2020-12-08
    • 1970-01-01
    • 2022-11-02
    相关资源
    最近更新 更多