flutter - 下拉菜单不显示数据抖动
问题描述
我正在尝试在下拉菜单中显示数据,但我有一个奇怪的问题,我似乎无法弄清楚。问题是当打开包含下拉菜单的视图时,api 数据从服务器获取数据,它可以正常工作但是数据第一次没有显示到下拉菜单中,在调试模式下,当我按下热 realod 时,数据显示在下拉菜单中,而不是当视图第一次显示时
下拉式菜单
Flexible(
flex: 0,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
height: 45,
width: 300,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5),
border: Border.all(
color: Color.fromRGBO(92, 52, 76, 1))),
child: DropdownButton<String>(
isExpanded: true,
itemHeight: 50,
underline: SizedBox(),
value: _selectedVehicle,
items: vehicle_list.map((vehicle) {
return DropdownMenuItem<String>(
value: vehicle.id,
child: new Text(
vehicle.model,
style: TextStyle(
fontSize: 15,
color: Color.fromRGBO(
92, 52, 76, 1)),
),
);
}).toList(),
hint: Padding(
padding: const EdgeInsets.all(8.0),
child: Text("Please Select Vehicle"),
),
onChanged: (newValues) {
setState(() {
_selectedVehicle = newValues;
});
}),
),
),
)
API
Future<String> getVehicles() async {
vehicle_list.clear();
Future tokens = SharedPrefrence().getToken();
tokens.then((data) async{
token=data;
var response = await http.get(Urls.BASE_URL + Urls.GET_VEHICLES, headers: {
"Authorization": "Bearer " + token,
"Content-Type": "application/json"
});
if (response.statusCode == 200) {
print("vechiles " + response.body.toString());
Map<String, dynamic> value = json.decode(response.body);
try {
var data = value['data'];
for (int i = 0; i < data.length; i++) {
var obj = data[i];
vehicle_list.add(VehicleModel(
obj['id'].toString(),
obj['user_id'].toString(),
obj['type'].toString(),
obj['model'],
obj['reg_no'],
obj['fuel_type'].toString()));
}
} catch (e) {
print(e.toString());
}
} else {
print(response.body.toString());
}
});
}
内化
List<VehicleModel> vehicle_list = [];
String _selectedVehicle;
这就是我调用函数的方式
@override
void initState() {
// TODO: implement initState
super.initState();
getVehicles();
}
解决方案
我认为这将解决您的问题:
Future<String> getVehicles() async {
vehicle_list.clear();
Future tokens = SharedPrefrence().getToken();
tokens.then((data) async{
token=data;
var response = await http.get(Urls.BASE_URL + Urls.GET_VEHICLES, headers: {
"Authorization": "Bearer " + token,
"Content-Type": "application/json"
});
if (response.statusCode == 200) {
print("vechiles " + response.body.toString());
Map<String, dynamic> value = json.decode(response.body);
try {
var data = value['data'];
for (int i = 0; i < data.length; i++) {
var obj = data[i];
vehicle_list.add(VehicleModel(
obj['id'].toString(),
obj['user_id'].toString(),
obj['type'].toString(),
obj['model'],
obj['reg_no'],
obj['fuel_type'].toString()));
}
// add this line...
WidgetsBinding.instance.addPostFrameCallback((_) => setState((){}));
} catch (e) {
print(e.toString());
}
} else {
print(response.body.toString());
}
});
}
推荐阅读
- c# - ASP.NET Core web.config 位置使用
- vue.js - 通过 axios 发出 Post 请求时将 HttpListenerContext.User 设为 null
- coq - Inductive 和 CoInductive 之间的唯一区别是对它们的使用(在 Coq 中)进行格式良好的检查吗?
- sql - oracle数据库中如何使用过滤查询
- embedded - 刷新图像与复制文件
- python - Pandas 生成器作为索引器
- r - 每组变异,然后解组
- android - 在没有 viewmodelScope 和 runBlocking 或 GlobalScope 的情况下调用 RoomDB 操作
- ios - 类型“TextView”不符合协议“UIViewRepresentable”
- ruby - Ruby 中 UTF-8 编码字符串中随机索引字符访问的时间复杂度是多少?