DropdownButton <List> с использованием локальных данных - не отображать элементы на экране, только после горячей перезагрузки
Я новичок в флаттере и не знаю, как решить эту проблему.
У меня есть список с методом ожидания, но мой экран не ожидает загрузки списка в список, только когда я обновляю его с помощью горячей перезагрузки, экран работает.
Мой асинхронный метод
ListaRefeitorio? _selecione;
List<ListaRefeitorio> _refeitorios = <ListaRefeitorio>[];
RefeitorioController controller = new RefeitorioController();
@override
void initState() {
super.initState();
_listarRefeitorios();
}
Мой экран
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBarControleAcessoWidget("Refeitório"),
body: Column(
children: [
SizedBox(height: 30),
Container(
child: Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
padding: EdgeInsets.only(left: 16, right: 16),
decoration: BoxDecoration(
border:
Border.all(color: AppColors.chartSecondary, width: 1),
borderRadius: BorderRadius.circular(15),
),
child: DropdownButton<ListaRefeitorio>(
hint: Text("Selecione Refeitório"),
dropdownColor: AppColors.white,
icon: Icon(Icons.arrow_drop_down),
iconSize: 36,
isExpanded: true,
underline: SizedBox(),
style: TextStyle(
color: AppColors.black,
fontSize: 20,
),
value: _selecione,
onChanged: (ListaRefeitorio? novoValor) {
setState(() {
_selecione = novoValor;
});
},
items: _refeitorios.map((ListaRefeitorio valueItem) {
return new DropdownMenuItem<ListaRefeitorio>(
value: valueItem,
child: new Text(valueItem.acessoPontoAcessoDescricao),
);
}).toList(),
),
),
),
),
),
Container(),
Expanded(
child: GridView.count(
crossAxisSpacing: 12,
mainAxisSpacing: 12,
crossAxisCount: 2,
children: [
Container(
child: SizedBox.expand(
child: FlatButton(
child: CardsWidget(
label: "Ler QR Code",
imagem: AppImages.scanQrCode,
),
onPressed: () {
scanQRCode();
},
),
),
),
Container(
child: SizedBox.expand(
child: FlatButton(
child: CardsWidget(
label: "Sincronizar Dados", imagem: AppImages.sync),
onPressed: () {
controller.sincronizar();
// RefeitorioService.listarRefeitorio();
},
),
),
),
SizedBox(height: 30),
Text("Resultado"),
Text(QRCode),
Text(DataHora),
Text(_selecione.toString()),
],
),
),
],
));
}
Я пробовал использовать futurebuilder, но не думаю, что это моя проблема.
Я не знаю что делать больше
1 ответ
У меня была такая же проблема со списком DropDownButton, отображаемым только из-за горячей перезагрузки, обновляющей состояние.
При использовании пользовательского сопоставления списка не забудьте использовать setState() в методе, который заполняет список данными (в моем случае это извлечение из Sqflite).
//This populate method would be called in either initstate or afterFirstLayout
populateDataList() {
sqlCodeList = await databaseHelper.getList();
setState(() {
_refeitorios = sqlCodeList;
});
}