Когда я пытаюсь использовать ListView, который содержит флажки со значением scrollDirection, установленным на Axis.horizontal, внутри SimpleDialog возникает ошибка: RenderShrinkWrappingViewport не поддерживает возврат внутренних размеров. Я попытался обернуть ListView с помощью Containers, Flexible... но все равно выдает ошибку.
Если я установил scrollDirection на Axis.vertical, он отлично работает. Я предполагаю, что проблема в том, что он находится внутри диалога.
@override
Widget build(BuildContext context) => SimpleDialog(
backgroundColor: Color.fromARGB(255, 229, 233, 240),
contentPadding: EdgeInsets.zero,
children: [
Expanded(
child: ListView(
shrinkWrap: true,
scrollDirection: Axis.horizontal,
children: [
...personCheckboxes.map(buildCheckboxes).toList(),
],
),
),
Функция buildCheckboxes:
Widget buildCheckboxes(CheckBoxState checkbox) => CheckboxListTile(
controlAffinity: ListTileControlAffinity.leading,
activeColor: Colors.blue,
value: checkbox.checked,
title: Text(checkbox.title, style: const TextStyle(fontSize: 12)),
onChanged: (value) => setState(() {
checkbox.checked = value!;
if (checkbox.value == 'M') {
maleChecked = checkbox.checked;
} else if (checkbox.value == 'F') {
femaleChecked = checkbox.checked;
}
checkResults();
setState(() {});
//runFilterCheckbox(checkbox.value, value);
}),
);
Я попытался обернуть виджет ListView разными виджетами (контейнер). Все равно выдает ошибку.
Widget build(BuildContext context) => SimpleDialog(
backgroundColor: Color.fromARGB(255, 229, 233, 240),
contentPadding: EdgeInsets.zero,
children: [
Container(
height: 100.0,
width: 100.0,
child: ListView(
shrinkWrap: true,
scrollDirection: Axis.horizontal,
children: [
...personCheckboxes.map(buildCheckboxes).toList(),
],
),
),
Даже после обертывания listView с помощью SizedBox проблема сохраняется:
@override
Widget build(BuildContext context) => SimpleDialog(
backgroundColor: Color.fromARGB(255, 229, 233, 240),
contentPadding: EdgeInsets.zero,
children: [
SizedBox(
height: 20.0,
width: double.maxFinite,
child: ListView(
shrinkWrap: true,
scrollDirection: Axis.horizontal,
children: [
...personCheckboxes.map(buildCheckboxes).toList(),
],
),
),
Оберните свой Listview в Sizedbox, придайте ему некоторую высоту и добавьте ширину, как width: double.maxFinite,
. Это должно работать после того, как вы добавите ширину, поскольку AlertDialog использует виджет IntrinsicWidth, который не разрешает ListView.builder.
Используйте Alert Dialog вместо SimpleDialog. Проверьте ниже код для реализации alertdialog:
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
content: Container(
width: double.maxFinite,
child: ListView(
children: <Widget>[]
),
),
);
}
);
Пробовал, все равно выдает ту же ошибку.
Еще раз отредактировал проверку ответов.
Все еще не работает. Я включил ваш ответ в вопрос.
измените SimpleDialog на AlertDialog. Проверьте ответ на реализацию.
все еще не работает, изменено на alertdialog. Но я все равно хотел бы сохранить SimpleDialog, он лучше масштабируется и не переполняется.
В горизонтальном списке и CheckboxListTile
пытаются получить бесконечную ширину. Вы можете обернуть CheckboxListTile
виджетом SizedBox и указать ширину. Вы можете воспользоваться помощью MediaQuery.of(context).size.width
. А для ListView
также требуется высота и ширина на корпусе, и можно использовать SizedBox с высотой и шириной.
SizedBox(
height: MediaQuery.of(context).size.height*.5,
width: 200, //or
child: ListView(
buildCheckboxes(...)=> SizedBox(
width: 200,
child: CheckboxListTile(
controlAffinity: ListTileControlAffinity.leading,
Также вы можете следить за другими виджетами, такими как AlertDialog. или просто
showDialog(
context: context,
builder: (context) => SizedBox(
height: MediaQuery.of(context).size.height * .5,
width: 200, //or
child: Material(..
SimpleDialog
в контенте showDialog?