我怎样才能像这样的 Facebook 帖子一样显示专辑图片?

Posted

技术标签:

【中文标题】我怎样才能像这样的 Facebook 帖子一样显示专辑图片?【英文标题】:How can i show Album images Like Facebook post like this? 【发布时间】:2020-06-27 16:49:14 【问题描述】:

根据用户上传的内容,我从 API 链接获取单个图像或多个图像链接。所以我想创建一个负责任的小部件。要根据 API 数据更改哪个。如果我得到超过 4 张图像,我想显示这样的计数。我的意思是在图像上。请看下面的图片标记

【问题讨论】:

【参考方案1】:

您可能应该创建一个小部件来处理所有这些。这是一个小例子。 这个小部件获取图像 URL 并将它们放在一个网格中,当图像数量超过 maxImages 时,它会执行 facebook 的操作。

根据您的要求调整小部件。

import 'dart:math';

class PhotoGrid extends StatefulWidget 
      final int maxImages;
      final List<String> imageUrls;
      final Function(int) onImageClicked;
      final Function onExpandClicked;

  PhotoGrid(
      @required this.imageUrls,
      @required this.onImageClicked,
      @required this.onExpandClicked,
      this.maxImages = 4,
      Key key)
      : super(key: key);

  @override
  createState() => _PhotoGridState();


class _PhotoGridState extends State<PhotoGrid> 
  @override
  Widget build(BuildContext context) 
    var images = buildImages();

    return GridView(
      gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
        maxCrossAxisExtent: 200,
        crossAxisSpacing: 2,
        mainAxisSpacing: 2,
      ),
      children: images,
    );
  

  List<Widget> buildImages() 
    int numImages = widget.imageUrls.length;
    return List<Widget>.generate(min(numImages, widget.maxImages), (index) 
      String imageUrl = widget.imageUrls[index];

      // If its the last image
      if (index == widget.maxImages - 1) 
        // Check how many more images are left
        int remaining = numImages - widget.maxImages;

        // If no more are remaining return a simple image widget
        if (remaining == 0) 
          return GestureDetector(
            child: Image.network(
              imageUrl,
              fit: BoxFit.cover,
            ),
            onTap: () => widget.onImageClicked(index),
          );
         else 
          // Create the facebook like effect for the last image with number of remaining  images
          return GestureDetector(
            onTap: () => widget.onExpandClicked(),
            child: Stack(
              fit: StackFit.expand,
              children: [
                Image.network(imageUrl, fit: BoxFit.cover),
                Positioned.fill(
                  child: Container(
                    alignment: Alignment.center,
                    color: Colors.black54,
                    child: Text(
                      '+' + remaining.toString(),
                      style: TextStyle(fontSize: 32),
                    ),
                  ),
                ),
              ],
            ),
          );
        
       else 
        return GestureDetector(
          child: Image.network(
            imageUrl,
            fit: BoxFit.cover,
          ),
          onTap: () => widget.onImageClicked(index),
        );
      
    );
  

下面是一个小例子:

var urls = <String>[
  'https://images.unsplash.com/photo-1503023345310-bd7c1de61c7d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80',
  'https://images.unsplash.com/photo-1503023345310-bd7c1de61c7d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80',
  'https://images.unsplash.com/photo-1503023345310-bd7c1de61c7d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80',
  'https://images.unsplash.com/photo-1503023345310-bd7c1de61c7d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80',
  'https://images.unsplash.com/photo-1503023345310-bd7c1de61c7d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80',
  'https://images.unsplash.com/photo-1503023345310-bd7c1de61c7d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80',
];

class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: Colors.white),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: PhotoGrid(
            imageUrls: urls,
            onImageClicked: (i) => print('Image $i was clicked!'),
            onExpandClicked: () => print('Expand Image was clicked'),
            maxImages: 4,
          ),
        ),
      ),
    );
  

飞镖垫的结果: 忽略我使用相同图像的事实。当您单击图像时,也会调用相应的函数。

【讨论】:

首先谢谢你,伙计,我试过这个答案,但图像不可见,i.stack.imgur.com/arMkA.png 尝试将网络图像更改为任何资产图像。检查您的模拟器是否可以访问互联网。有时,我在模拟器上遇到类似的互联网问题,通常通过重新启动来解决。告诉我它是否有效。 是的,我已经更改了网络映像 (picsum.photos/250?image=9),并且我的模拟器 Internet 运行良好,因为我从服务器检索 API 数据 谢谢,伙计,工作正常,加载需要时间,如果您喜欢我的问题,请投票。 我在Listview.builder() 中使用了这个PhotoGrid,我遇到了一个问题1。我无法滚动PhotoGrid 小部件,然后用户点击一张图片

以上是关于我怎样才能像这样的 Facebook 帖子一样显示专辑图片?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 中创建像 Facebook 帖子这样的照片网格?

Android : 像 Facebook 一样有多个图像和视频的新闻源

图片无法正确显示,我想像 Facebook 图片帖子一样显示

如何在 Facebook 分享弹出窗口中显示视频缩略图

如何使用 PHP 和 Jquery 开发像 facebook 这样的警报系统?

从 Facebook 重定向到 IOS 应用程序的特定帖子