#flutter #flutter-layout
#сбой #сбой-макет
Вопрос:
У меня есть таблица, элементами сетки которой в основном являются: Карточки с двумя элементами :
- Изображение
- Текст
Но изображение загружается через Интернет, поэтому иногда оно переполняет поле элемента сетки, и это поле не изменяет высоту, я хочу, чтобы изображение было фиксированного размера.
Вот мой код: (Как мне это сделать?)
import 'package:flutter/material.dart';
import '../models/dbModel.dart';
class GridLayout extends StatelessWidget {
final List<DbModel> m;
var appContext;
GridLayout(this.m, this.appContext);
Widget build(context) {
return GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, crossAxisSpacing: 7.0, mainAxisSpacing: 7.0),
padding: const EdgeInsets.all(10.0),
itemBuilder: (context, i) {
return GridItem(appContext, m[i]);
},
itemCount: m.length,
);
}
}
class GridItem extends StatelessWidget {
final appContext;
final dbModel;
GridItem(this.appContext, this.dbModel);
Widget build(context) {
return GestureDetector(
onTap: () {},
child: Card(
child: Column(
children: <Widget>[
dbModel.img == "NOLINK" ? Image.network("https://i.ibb.co/Vv6cPj4/404.png",) : Image.network(dbModel.img),
Container(
padding: EdgeInsets.all(10.0),
child: Text("${dbModel.title}"),
),
],
),
),
);
}
}
Ответ №1:
вам нужно обернуть виджет изображения — Image.network
с помощью Expanded
amp; add fit: BoxFit.cover,
.
рабочий код:
Widget build(context) {
return GestureDetector(
onTap: () {},
child: Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, //add this
children: <Widget>[
Expanded(
child: Image.network(
"https://i.ibb.co/Vv6cPj4/404.png",
fit: BoxFit.cover, // add this
),
),
Center(
child: Container(
padding: EdgeInsets.all(10.0),
child: Text("Title under"),
),
),
],
),
),
);
}
вывод:
Комментарии:
1. возникла та же проблема, но когда я попытался использовать GestureDetector внутри столбца, ничего не отображается?? я не знаю, почему
2. как задать произвольную высоту изображения?
Ответ №2:
Используйте контейнер и внутри контейнера указывайте ширину и высоту изображения так, как вы хотите.
new Container(
width: 60.0
height: 60.0,
decoration: new BoxDecoration(
image: new DecorationImage(
image:Image.network("https://i.ibb.co/Vv6cPj4/404.png",),
//repeat: ImageRepeat.repeat,
),
),
)
Я надеюсь, это вам поможет.