Мне нужно динамически загружать список городов из остальных веб-сервисов и позволить пользователю выбрать один город из диалогового окна с предупреждением.Мой код:
createDialog() {
fetchCities().then((response) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Wybierz miasto'),
content: Container(
height: 200.0,
width: 400.0,
child: ListView.builder(
shrinkWrap: true,
itemCount: response.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text(response[index].name),
onTap: () => citySelected(response[index].id),
);
},
),
),
);
}
);
});
}
Результат - диалоговое окно всегда 200x400, даже если доступны только 2 города, внизу остается ненужная комната:
Как сделать ширину / высоту диалогового окна, чтобы соответствовать фактическому размеру элементов?Если я пропускаю параметры height
и width
, я получаю исключение, и диалог не отображается.В нативной Android Java мне никогда не нужно указывать какие-либо размеры, потому что размеры диалогов автоматически подгоняются.
Как исправить мой код для правильного размера диалогового окна?Обратите внимание, что я не знаю количество элементов, оно динамическое.
[править]
Как и предполагалось, я обернул содержимое столбцом:
createDialog() {
fetchCities().then((response) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Wybierz miasto'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
child: ListView.builder(
shrinkWrap: true,
itemCount: response.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text(response[index].name),
onTap: () => citySelected(response[index].id),
);
},
),
)
]
),
);
}
);
});
}
Результат - исключение:
I / трепетание (5917): ══╡ ИСКЛЮЧЕНИЕ ПРИОБРЕТЕНО БИБЛИОТЕКОЙ ╞══════════════════════════════════════════════════════════════ I / flutter (5917): во время executeLayout () было выдвинуто следующее утверждение: I/ flutter (5917): RenderViewport не поддерживает возврат внутренних размеров.I / flutter (5917): вычисление внутренних измерений потребовало бы создания экземпляра каждого дочернего элемента окна просмотра, которое I / flutter (5917): побеждает ленивую точку области просмотра.
Более общий код для тестирования:
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Select city'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
child: ListView.builder(
shrinkWrap: true,
itemCount: 2,
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text("City"),
onTap: () => {},
);
},
),
)
]
),
);
}
);