使用ListTile()将从Api加载的图像安排到Flutter中的两列中

问题描述 投票:-1回答:2

我已成功将JSON数据从API加载到Flutter应用中。 JSON数据由图像列表组成。 JSON数据采用以下格式。

{
    "images":[
    {
        "id":1,
        "images":"http://url_1.jpg"

    },
    {
        "id":3,
        "images":"http://url_3.jpg"

    },
    {
        "id":4,
        "images":"http://url_4.jpg"

    },
    {
        "id":5,
        "images":"https://url_5.jpg"

    }
]
}

而且我已经使用以下代码片段将数据加载到列表中,并且可以正常工作。

_fetchData() async {
    setState(() {
      isLoading = true;
    }); //setState
    final response = await http.get("http://192.168.43.95:3000/memes");
    print("response");
    if (response.statusCode == 200) {
      list = json.decode(response.body) as List;
      print(list);
      setState(() {
        isLoading = false;
      });
    } else {
      throw Exception('Failed to load photos');
    }
  }

并且我用以下代码块显示了图像:

ListView.builder(
                itemCount: list.length,
                itemBuilder: (BuildContext context, int index) {
                  return ListTile(
                    contentPadding: EdgeInsets.all(10.0),
                    leading: Image.network(
                      list[index]['images'],
                      fit: BoxFit.contain,
                    ),
                  );
                })

现在,我需要修改上面的代码,以便将屏幕分为2列。图像应放置在这些列中(两列的宽度相同),并且每个图像的高度与其宽度成比例。另外,当我们向下滚动时,其余图像应加载到这两列中。 类似于chrome中的Google图像搜索结果

需要进行哪些更改?如果使用ListTile()无法做到这一点,该怎么办?enter image description here

flutter dart flutter-layout
2个回答
1
投票

使用flutter_staggered_grid_view:“ ^ 0.2.7”来自here

StaggeredGridView.countBuilder(
    crossAxisCount: 4,
    itemCount: list.length,
    itemBuilder: (BuildContext context, int index) => new Card(
      elevation: 5.0,
      shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.all(Radius.circular(5.0))),
      child: Container(
        decoration: BoxDecoration(
          borderRadius: BorderRadius.all(Radius.circular(5.0)),
          image: DecorationImage(
              image: NetworkImage(list[index]['images']),
              fit: BoxFit.cover),
        ),
      ),
    ),
    staggeredTileBuilder: (int index) =>
        new StaggeredTile.count(2, index.isEven ? 2 : 1.5),
    mainAxisSpacing: 4.0,
    crossAxisSpacing: 4.0,
  ),

enter image description here


0
投票

这对我来说很好。 crossAxisCount:2分为两列,而StaggeredTile.fit(1)将每个图块放入一列。

StaggeredGridView.countBuilder(
              crossAxisCount: 2,
              itemCount: list.length,
              itemBuilder: (BuildContext context, int index) => Container(
                        margin: EdgeInsets.fromLTRB(5, 5, 5, 5),
                        child: Image(
                            fit: BoxFit.fill,
                            image: NetworkImage(list[index]['image']))),
              staggeredTileBuilder: (int index) => new StaggeredTile.fit(1),
            ),
© www.soinside.com 2019 - 2024. All rights reserved.