(Колебание) Горизонтальный ListView.Builder внутри ячейки данных строки с данными

#flutter

#трепетание

Вопрос:

Я должен сказать, что у меня всегда возникают проблемы с получением ListViews внутри столбцов, строк и т. Д. без получения тонны ошибок и необходимости действительно находить обходные пути. Я искал это и не могу найти решение, которое работает.

Я пытаюсь поместить ListView.builder внутри каждой ячейки данных DataTable. Вот пример, который я придумал.

Я пробовал так много разных вещей — помещал ListView в контейнер с заданной шириной / высотой, помещал его в гибкий, помещал в столбец / строку и так далее, и так далее. Я также пробовал всевозможные варианты свойств в ListView.builder (т.Е. Включение и выключение shrinkWrap, физика и отсутствие физики и т. Д.), И Каждый из них выдает мне новые ошибки, и ни один из них не работает.

   Widget build(BuildContext context) {
List<DataRow> _testRows = [
  DataRow(
    cells: [
      DataCell(
        ListView.builder(
          shrinkWrap: true,
          physics: NeverScrollableScrollPhysics(),
          itemCount: 3,
          scrollDirection: Axis.horizontal,
          itemBuilder: (BuildContext context, int index) {
            return Text(index.toString());
          },
        ),
      ),
      DataCell(
        Text('Data B'),
      ),
      DataCell(
        Text('Data C'),
      ),
    ],
  ),
];

return Scaffold(
  body: DataTable(
    columns: const <DataColumn>[
      DataColumn(
        label: Text('Column A'),
      ),
      DataColumn(
        label: Text('Column B'),
      ),
      DataColumn(
        label: Text('Column C'),
      ),
    ],
    rows: _testRows,
  ),
);
  

}

Ответ №1:

Вы можете скопировать вставить запустить полный код ниже
, в этом случае вы можете использовать function _testRows() и обернуть ListView Container и установить width
фрагмент кода

  List<DataRow> _testRows() {
    return [
      DataRow(
        cells: [
          DataCell(
            Container(
              width: 100,
              child: ListView.builder(
  

рабочая демонстрация

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

полный код

 import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<DataRow> _testRows() {
    return [
      DataRow(
        cells: [
          DataCell(
            Container(
              width: 100,
              child: ListView.builder(
                shrinkWrap: true,
                physics: NeverScrollableScrollPhysics(),
                itemCount: 3,
                scrollDirection: Axis.horizontal,
                itemBuilder: (BuildContext context, int index) {
                  return Text(index.toString());
                },
              ),
            ),
          ),
          DataCell(
            Text('Data B'),
          ),
          DataCell(
            Text('Data C'),
          ),
        ],
      ),
    ];
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: DataTable(columns: const <DataColumn>[
          DataColumn(
            label: Text('Column A'),
          ),
          DataColumn(
            label: Text('Column B'),
          ),
          DataColumn(
            label: Text('Column C'),
          ),
        ], rows: _testRows()),
      ),
    );
  }
}
  

Комментарии:

1. Спасибо, это сработало в примере. У меня все еще есть несколько проблем с моим реальным кодом, в основном потому, что это не заданное количество элементов в ListView, которое я забыл указать. Поэтому я не могу ограничить ширину этого ListView, потому что он будет обрезан, если он должен быть больше заданной ширины.

2. В итоге я просто использовал контейнер, а для ширины поставил 50,0 * list.length. В основном просто делаем ширину значка * количество элементов в списке. Это просто кажется странным способом сделать это. Я чувствую, что мне не хватает какого-то важного виджета, который я должен использовать; Я думал, что Flexible делает это, но я думаю, что нет.