flutter - 水平 ListView / GridView 中不同大小的图像,具有固定高度和动态宽度

标签 flutter dart flutter-layout

我想创建一个水平的 ListViewGridView,图像的高度是固定的,但图像的宽度应该是动态的

下面是我正在尝试执行但无法获得预期输出的代码。我还添加了说明预期输出的设计截图

With List View

import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';


class ViewPager extends StatefulWidget {
  createState() => _ViewPager();
}

class _ViewPager extends State<ViewPager> {

  static final exercise_image1 = "https://drive.google.com/uc?export=download&id=1eDhXVJrNExRwi85pQGCOAwPYi7X-sA0l";
  static final exercise_image2 = "https://drive.google.com/uc?export=download&id=1ifjpLw2ocBAIbEOIhsTtczf8dWuvexri";


  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Column(
        children: [
          _imagesList(images: [exercise_image1, exercise_image2]),
        ],
      ),
    );
  }



  Widget _imagesList({List<String> images}) {

    return Container(
      width: double.maxFinite,
      height: 150,
      color: Colors.red,
      child: ListView(
        scrollDirection: Axis.horizontal,
        children: [
          _imageListItem(imagePath: images.first),
          _imageListItem(imagePath: images.last),
        ],
      ),
    );

  }

  Widget _imageListItem({@required String imagePath}) {

    return CachedNetworkImage(
      width: 200, // I want this to be according to the image width
      imageUrl: imagePath,
      placeholder: (context, url) => Container(
        child: CircularProgressIndicator(),
      ),
      imageBuilder: (context, imageProvider) => Container(
        decoration: BoxDecoration(
          image: DecorationImage(
              image: imageProvider,
              fit: BoxFit.fitHeight
          ),
        ),
      ),
    );

  }

}

enter image description here

With Grid View

与 GridView 相同的问题,我们设置了 GridView 的高度但无法为图像提供动态宽度

import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';


class ViewPager extends StatefulWidget {
  createState() => _ViewPager();
}

class _ViewPager extends State<ViewPager> {

  static final exercise_image1 = "https://drive.google.com/uc?export=download&id=1eDhXVJrNExRwi85pQGCOAwPYi7X-sA0l";
  static final exercise_image2 = "https://drive.google.com/uc?export=download&id=1ifjpLw2ocBAIbEOIhsTtczf8dWuvexri";


  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          height: 200,
          child: _imagesList(images: [exercise_image1, exercise_image2]),
        ),
      ),
    );


  }


  Widget _imagesList({List<String> images}) {

    return GridView.count(
      crossAxisCount: 1,
      scrollDirection: Axis.horizontal,
      children: [
        _imageListItem(imagePath: images[0]),
        _imageListItem(imagePath: images[1]),
      ],
    );

  }

  Widget _imageListItem({@required String imagePath}) {

    return CachedNetworkImage(
      imageUrl: imagePath,
      placeholder: (context, url) => Container(
        child: CircularProgressIndicator(),
      ),
      imageBuilder: (context, imageProvider) => Container(
        decoration: BoxDecoration(
          image: DecorationImage(
              image: imageProvider,
              fit: BoxFit.fitHeight
          ),
        ),
      ),
    );

  }

}

最佳答案

实现这一目标的一种方法是这样的。

class _MyWidgetState extends State<MyWidget> {
  static final exercise_image1 = "https://drive.google.com/uc?export=download&id=1eDhXVJrNExRwi85pQGCOAwPYi7X-sA0l";
  static final exercise_image2 = "https://drive.google.com/uc?export=download&id=1ifjpLw2ocBAIbEOIhsTtczf8dWuvexri";

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          height: 200,
          child: _imagesList(images: [exercise_image1, exercise_image2]),
        ),
      ),
    );
  }

  Widget _imagesList({List<String> images}) {
    return ListView(
      scrollDirection: Axis.horizontal,
      children: [
        _imageListItem(imagePath: images[0]),
        _imageListItem(imagePath: images[1]),
      ],
    );
  }

  Widget _imageListItem({@required String imagePath}) {
    return CachedNetworkImage(
      imageUrl: imagePath,
      placeholder: (context, url) => Container(
        child: CircularProgressIndicator(),
      ),
    );
  }
}

关于flutter - 水平 ListView / GridView 中不同大小的图像,具有固定高度和动态宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66529316/

相关文章:

json - 如何访问纯dart包中的 Assets 文件?

flutter - 检查应用程序是否在测试环境中运行

dart - Flutter中的文件列表

dart - Dart 中的 += 运算符重载

flutter - 自定义 Clipper Bezier 曲线 Flutter

http - Flutter http 客户端给出 FormatException : Unexpected character (at character 1) &lt;! DOCTYPE html>

flutter - 在启用空安全的应用程序 Dart 内使用非空安全包

dart - 角 Dart : matching rules for route path - implicit suffix wildcard?

flutter - 如何在 TextFormField 获得焦点时隐藏错误外观

listview - 如何在 flutter 中实现如下设计?