размер контейнера не меняется в pageView.builder - PullRequest
0 голосов
/ 07 августа 2020

это результат моего кода.

У меня есть четыре изображения для использования в PageView виджете, и, поскольку размер некоторых изображений отличается от другого изображения, я хочу соответствовать размеру картинок через боксфит. Но чтобы сделать boxfit, высота изображения такая большая.

Поэтому я ограничил Container свойством height, но независимо от того, как я установил высоту контейнера в виджете makePage, (например, 100, height / 8 ...) высота контейнера фиксирована (зеленый контейнер)

Это из-за viewportFraction? Кто-нибудь знает, что вызывает это?

Виджет _makePage возвращает каждую страницу (изображение) для PageView

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: Scaffold(body: DotIndicator()),
    );
  }
}

class DotIndicator extends StatefulWidget {
  @override
  _DotIndicatorState createState() => _DotIndicatorState();
}

class _DotIndicatorState extends State<DotIndicator> {
  final List<String> imgEx = [
    'images/1.jpg',
    'images/2.jpg',
    'images/3.jpg',
    'images/4.jpg',
  ];

  //pageView controller
  final _controller = PageController(viewportFraction: 0.8);
  double currentPage = 0.0;

  @override
  Widget build(BuildContext context) {
    return _showMenuPage(context); 
  }

  Widget _showMenuPage(BuildContext context) {
    final _itemCount = imgEx.length;

    return Container(
      height: MediaQuery.of(context).size.height / 2,
      color: Colors.grey[300],
      child: Stack(
        children: [
          PageView.builder(
            controller: _controller,
            itemCount: _itemCount, 
            itemBuilder: (context, itemIndex) {
              return _makePage(context, itemIndex); 
            },
          )
        ],
      ),
    );
  }

  Widget _makePage(BuildContext context, int itemIndex) {
    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 4.0),
      child: Container(
        height: MediaQuery.of(context).size.height /4,
        width: MediaQuery.of(context).size.width * 0.8,
        color: Colors.green,
        child: Image.asset(imgEx[itemIndex], ),
      ),
    );
  }
}

Ответы [ 3 ]

1 голос
/ 07 августа 2020

Вам нужно поместить изображение в BoxDecoration зеленого Container:

Widget _makePage(BuildContext context, int itemIndex) {
    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 4.0),
      child: Container(
        height: MediaQuery.of(context).size.height /4,
        width: MediaQuery.of(context).size.width * 0.8,
        decoration: BoxDecoration(
          color: Colors.green,
          image: DecorationImage(
            image: AssetImage(imgEx[itemIndex]),
            fit: BoxFit.cover
          )
        )
      ),
    );
  }

Вы можете указать ширину и высоту в ограничениях контейнера:

child: Container(
  constraints: BoxConstraints(
            maxHeight: MediaQuery.of(context).size.height /4,
            maxWidth: MediaQuery.of(context).size.width * 0.8,
          ),
...
0 голосов
/ 07 августа 2020
Widget _makePage(BuildContext context, int itemIndex) {
return Padding(
  padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 70),
  child: Container(
    decoration: BoxDecoration(
      color: Colors.green,
      image: DecorationImage(
          image: AssetImage(imgEx[itemIndex]),fit: BoxFit.cover)),
  ),
);}

Я до сих пор не понимаю, почему размер контейнера не меняется с высотой или BoxConstraints, но я получил результат, добавив больше Padding - EdgeInsets.symmetri c (по горизонтали: 20,0, по вертикали: 70),

введите описание изображения здесь

0 голосов
/ 07 августа 2020

Проблема заключается в изменении height и width в соответствии с вашими потребностями,

Widget _showMenuPage(BuildContext context) {
    final _itemCount = imgEx.length;

    return Container(
       height: MediaQuery.of(context).size.height / 3,
       width: MediaQuery.of(context).size.width * 0.8,
      color: Colors.grey[300],
      child: Stack(
        children: [
          PageView.builder(
            pageSnapping: false,
            controller: _controller,
            itemCount: _itemCount,
            itemBuilder: (context, itemIndex) {
              return _makePage(context, itemIndex);
            },
          )
        ],
      ),
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...