Сбой при переполнении элемента сетки

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

Я надеюсь, это вам поможет.