我在flutter中使用FutureBuilder來填充下拉選單DropdownButtonFormField,我有方法
onChanged: (String? newValue) {
setState(() {
dropdownBrokers = newValue!;
});
},
這允許小部件重建,然后分配從下拉串列中選擇的新值。但是,我現在在研究中遇到一個問題,即每當呼叫 setState() 時,未來的構建器都會再次運行,這會使我的下拉選單再次填充。這是完整的代碼片段
FutureBuilder <List<Broker>>(
future: brokerData,
builder: (context, snapshot){
if(snapshot.hasData){
//do what needs to be done here
List<Broker>? data = snapshot.data;
for(var i = 0; i< data!.length; i ){
_brokers.add(data[i].firmName);
print(data[i].firmName);
}
return Container(
padding: EdgeInsets.all(10),
child: InputDecorator(
decoration: InputDecoration(
labelStyle: TextStyle(
color: Colors.grey
),
isDense: true,
contentPadding: EdgeInsets.all(7.0),
errorStyle: TextStyle(color: Colors.redAccent, fontSize: 16.0),
hintText: 'Select Broker',
border: OutlineInputBorder(borderRadius: BorderRadius.circular(5.0))),
child: DropdownButtonHideUnderline(
child: DropdownButtonFormField<String>(
alignment: Alignment.center,
value: dropdownBrokers,
icon: const Icon(Icons.arrow_downward),
iconSize: 24,
elevation: 16,
style: const TextStyle(color: Colors.indigo),
onChanged: (String? newValue) {
setState(() {
dropdownBrokers = newValue!;
});
},
items: _brokers.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
),
),
),
);
當我重新選擇一個專案時,我也會收到錯誤訊息。我如何防止 FutureBuilder 運行兩次
uj5u.com熱心網友回復:
FutureBuilder 將始終呈現一次,除非在 build 方法中重新創建。因此可以通過兩種方式解決此問題:1:僅brokerData在 FutureBuilder 方法中呼叫或 2:僅在 initState 覆寫中呼叫 ```brokerData``。你不能兩者都做。
我假設要在下拉串列中填充的資料來自未來的構建器。然后snapshot.data在這種情況下使用未來而不是已經創建的值:
items: _brokers.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
改成:
items: snapshot.data.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/339526.html
標籤:扑
下一篇:如何在容器中顯示國家代碼
