#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 делает это, но я думаю, что нет.