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.
);
}}