我需要从rest webservice动态加载城市列表,并允许用户从警告对话框中选择一个城市。
我的代码:
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/flutter ( 5917): ══╡ 渲染库捕获的异常 ╞═════════════════════════════════════════════════════════ I/flutter ( 5917): 在执行布局过程中抛出了以下断言: 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: () => {},
);
},
),
)
]
),
);
}
);