ListView внутри FittedBox не прокручивается

#flutter #dart

Вопрос:

Хотя FittedBox масштабируется ListView правильно, я не могу прокручивать представление списка по горизонтали:

 import 'dart:ui';

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      scrollBehavior: MyCustomScrollBehavior(),
      home: Scaffold(
          body: Container(
        height: 200,
        child: FittedBox(
          alignment: Alignment(-1, -1),
          fit: BoxFit.fitHeight,
          child: Container(
            height: 100,
            child: ListView.builder(
                itemCount: 20,
                scrollDirection: Axis.horizontal,
                shrinkWrap: true,
                itemBuilder: (context, index) => Container(
                    width: 100,
                    height: 100,
                    child: Text(index.toString()),
                    decoration: BoxDecoration(border: Border.all(width: 3, color: Colors.red)))),
          ),
        ),
      )),
    );
  }
}

class MyCustomScrollBehavior extends MaterialScrollBehavior {
  // Override behavior methods and getters like dragDevices
  @override
  Set<PointerDeviceKind> get dragDevices => {
        PointerDeviceKind.touch,
        PointerDeviceKind.mouse,
      };
}
 

Вместо этого отображаются первые несколько видимых контейнеров. Представление списка прокручивается правильно без соответствующего поля.

Интересно то, что если я укажу ScrollController() с набором initialScrollOffset, представление списка сначала отображается с указанным смещением прокрутки, но затем анимируется обратно со смещением 0.

Ответ №1:

В итоге я упаковал каждый элемент ListView в подходящий ящик. В моем реальном коде каждый элемент списка сложен, поэтому упаковка их в подходящую коробку позволяет мне масштабировать их с учетом требований. Было бы неплохо, если бы я мог сделать все вышесказанное, имея возможность прокручивать.

 import 'dart:ui';

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      scrollBehavior: MyCustomScrollBehavior(),
      home: Scaffold(
          body: Row(
        children: [
          SizedBox(width: 30),
          Expanded(
            child: Container(
              height: 200,
              child: ListView.builder(
                  itemCount: 20,
                  scrollDirection: Axis.horizontal,
                  shrinkWrap: true,
                  itemBuilder: (context, index) => Container(
                        height: 200,
                        child: FittedBox(
                          alignment: Alignment.topLeft,
                          fit: BoxFit.fitHeight,
                          child: Container(
                              width: 100,
                              height: 100,
                              child: Text(index.toString()),
                              decoration: BoxDecoration(border: Border.all(width: 3, color: Colors.red))),
                        ),
                      )),
            ),
          ),
        ],
      )),
    );
  }
}

class MyCustomScrollBehavior extends MaterialScrollBehavior {
  // Override behavior methods and getters like dragDevices
  @override
  Set<PointerDeviceKind> get dragDevices => {
        PointerDeviceKind.touch,
        PointerDeviceKind.mouse,
      };
}