Flutter 水平列表视图/栅格视图中不同大小的图像,颤振中具有固定高度和动态宽度

Flutter 水平列表视图/栅格视图中不同大小的图像,颤振中具有固定高度和动态宽度,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我想创建一个具有固定图像高度的水平列表视图或网格视图,但是图像的宽度应该是动态的 下面是我试图执行的代码,但无法获得预期的输出。我还添加了说明预期输出的设计截图 带列表视图 导入“包装:颤振/材料.省道”; 导入“package:cached_network_image/cached_network_image.dart”; 类ViewPager扩展StatefulWidget{ createState()=>u ViewPager(); } 类_ViewPager扩展状态{ 静态最终练习_im

我想创建一个具有固定图像高度的水平列表视图网格视图,但是图像的宽度应该是动态的

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

带列表视图

导入“包装:颤振/材料.省道”;
导入“package:cached_network_image/cached_network_image.dart”;
类ViewPager扩展StatefulWidget{
createState()=>u ViewPager();
}
类_ViewPager扩展状态{
静态最终练习_image1=”https://drive.google.com/uc?export=download&id=1eDhXVJrNExRwi85pQGCOAwPYi7X-sA0l”;
静态最终练习_image2=”https://drive.google.com/uc?export=download&id=1ifjpLw2ocBAIbEOIhsTtczf8dWuvexri";
@凌驾
小部件构建(构建上下文){
返回SingleChildScrollView(
子:列(
儿童:[
_图像列表(图像:[练习图像1,练习图像2]),
],
),
);
}
小部件_imagesList({List images}){
返回容器(
宽度:double.maxFinite,
身高:150,
颜色:颜色,红色,
子:ListView(
滚动方向:轴水平,
儿童:[
_imageListItem(imagePath:images.first),
_imageListItem(imagePath:images.last),
],
),
);
}
小部件_imageListItem({@required String imagePath}){
返回CachedNetworkImage(
宽度:200,//我希望这与图像宽度一致
imageUrl:imagePath,
占位符:(上下文,url)=>容器(
子对象:CircularProgressIndicator(),
),
imageBuilder:(上下文,imageProvider)=>容器(
装饰:盒子装饰(
图像:装饰图像(
图片:imageProvider,
适合:BoxFit.fit高度
),
),
),
);
}
}

具有栅格视图

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

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
          ),
        ),
      ),
    );

  }

}
导入“包装:颤振/材料.省道”;
导入“package:cached_network_image/cached_network_image.dart”;
类ViewPager扩展StatefulWidget{
createState()=>u ViewPager();
}
类_ViewPager扩展状态{
静态最终练习_image1=”https://drive.google.com/uc?export=download&id=1eDhXVJrNExRwi85pQGCOAwPYi7X-sA0l”;
静态最终练习_image2=”https://drive.google.com/uc?export=download&id=1ifjpLw2ocBAIbEOIhsTtczf8dWuvexri";
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
主体:容器(
身高:200,
子项:_图像列表(图像:[练习_图像1,练习_图像2]),
),
),
);
}
小部件_imagesList({List images}){
返回GridView.count(
交叉轴计数:1,
滚动方向:轴水平,
儿童:[
_imageListItem(imagePath:images[0]),
_imageListItem(imagePath:images[1]),
],
);
}
小部件_imageListItem({@required String imagePath}){
返回CachedNetworkImage(
imageUrl:imagePath,
占位符:(上下文,url)=>容器(
子对象:CircularProgressIndicator(),
),
imageBuilder:(上下文,imageProvider)=>容器(
装饰:盒子装饰(
图像:装饰图像(
图片:imageProvider,
适合:BoxFit.fit高度
),
),
),
);
}
}

您所说的是纵横比,您希望它适合宽度

在图像小部件中,将fit设置为BoxFit.fitWidth,问题将得到解决


了解更多信息。

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

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(),
      ),
    );
  }
}
class\u MyWidgetState扩展状态{
静态最终练习_image1=”https://drive.google.com/uc?export=download&id=1eDhXVJrNExRwi85pQGCOAwPYi7X-sA0l”;
静态最终练习_image2=”https://drive.google.com/uc?export=download&id=1ifjpLw2ocBAIbEOIhsTtczf8dWuvexri";
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
主体:容器(
身高:200,
子项:_图像列表(图像:[练习_图像1,练习_图像2]),
),
),
);
}
小部件_imagesList({List images}){
返回列表视图(
滚动方向:轴水平,
儿童:[
_imageListItem(imagePath:images[0]),
_imageListItem(imagePath:images[1]),
],
);
}
小部件_imageListItem({@required String imagePath}){
返回CachedNetworkImage(
imageUrl:imagePath,
占位符:(上下文,url)=>容器(
子对象:CircularProgressIndicator(),
),
);
}
}

尝试像这样使用listview。它是给你想要的输出

     @override
  Widget build(BuildContext context) {
    Widget _imageListItem({@required String imagePath}) {
      return   CachedNetworkImage(
        imageUrl: imagePath,
        placeholder: (context, url) => CircularProgressIndicator(),
        errorWidget: (context, url, error) => Icon(Icons.error),
      );
    }
    Widget horizontalList1 = new Container(
      margin: EdgeInsets.symmetric(vertical: 20.0),
      height: 200.0,
      child:
      ListView(
        scrollDirection: Axis.horizontal,
        children: <Widget>[
          _imageListItem(imagePath: exercise_image1),
          SizedBox(width: 2,),
          _imageListItem(imagePath: exercise_image2),

        ],
      ),
    );
    return new Scaffold(
      body: new Center(
        child: new Container(
          child: ListView(
            scrollDirection: Axis.vertical,
            children: <Widget>[
              horizontalList1,
            ],
          ),
        ),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }}
@覆盖
小部件构建(构建上下文){
小部件_imageListItem({@required String imagePath}){
返回CachedNetworkImage(
imageUrl:imagePath,
占位符:(上下文,url)=>CircularProgressIndicator(),
errorWidget:(上下文、url、错误)=>图标(Icons.error),
);
}
Widget horizontalList1=新容器(
边缘:边缘组。对称(垂直:20.0),
高度:200.0,
儿童:
列表视图(
滚动方向:轴水平,
儿童:[
_imageListItem(imagePath:exercise_image1),
尺寸标注框(宽度:2,),
_imageListItem(imagePath:exercise_image2),
],
),
);
归还新脚手架(
正文:新中心(
子容器:新容器(
子:ListView(
滚动方向:轴垂直,
儿童:[
水平仪1,
],
),
),
),//此尾随逗号使生成方法的自动格式设置更方便。
);
     @override
  Widget build(BuildContext context) {
    Widget _imageListItem({@required String imagePath}) {
      return   CachedNetworkImage(
        imageUrl: imagePath,
        placeholder: (context, url) => CircularProgressIndicator(),
        errorWidget: (context, url, error) => Icon(Icons.error),
      );
    }
    Widget horizontalList1 = new Container(
      margin: EdgeInsets.symmetric(vertical: 20.0),
      height: 200.0,
      child:
      ListView(
        scrollDirection: Axis.horizontal,
        children: <Widget>[
          _imageListItem(imagePath: exercise_image1),
          SizedBox(width: 2,),
          _imageListItem(imagePath: exercise_image2),

        ],
      ),
    );
    return new Scaffold(
      body: new Center(
        child: new Container(
          child: ListView(
            scrollDirection: Axis.vertical,
            children: <Widget>[
              horizontalList1,
            ],
          ),
        ),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }}