Flutter下拉框在将来与API一起使用时会导致错误



我是个新手。我使用的是API,它将数据作为JSON发送到该API。JSON的格式在这里。

[
{
"store": "AMAZON"
},
{
"store": "FLIPKART"
},
{
"store": "WALMART"
},
{
"store": "ALIBABA"
},
]

我需要在下拉按钮中使用此存储值。有三个文件dataRetrieve.dart、homePage.dart、main.dart.main.dart指向homePage.dart-

dart的init状态调用dataRetrieve.dart以发出获取数据的post请求。homePage.dart的代码在这里。

var markets;
String _mySelection;
@override
void initState() {
super.initState();
setState(() {
markets = retrievedata.getMarket();
});
}

在homePage.dart中,我有一个下拉按钮,代码就在这里。

child: DropdownButton(
items: stores,
onChanged: (sto) {
setState(() {
_mySelection = sto;
});
},
value: _mySelection,
hint: Text('Please select the store: '),
),

数据。Retrieve.dart代码在这里。

import 'dart:convert';
import 'package:http/http.dart';
class retrieveData {
getMarket() async {
String url;
Response response = await post(url);
var resp = json.decode(response.body);
List stores = List();
for (int i = 0; i < json.decode(response.body).length; i++) {
stores.add(resp[i]['store']);
}
return stores;
}
}
final retrieveData retrievedata = retrieveData();

main.dart文件在这里。

import 'package:agrimarket/homePage.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter App',
debugShowCheckedModeBanner: false,
home: homePage(),
);
}
}

而此代码会产生一些错误。错误在这里

═╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following _TypeError was thrown building homePage(dirty, state: homePageState#8914c):
type 'Future<dynamic>' is not a subtype of type 'List<DropdownMenuItem<String>>'
The relevant error-causing widget was:
homePage
libmain.dart:14
When the exception was thrown, this was the stack:

我已经声明并分配了URL。

如何在下拉列表中使用检索到的值。

解决方案是使DrowpDownButton的父窗口小部件成为ListView.builder。然后,使itemCount:markets.length,并最终使用此格式在下拉菜单项的项中进行解析

items: <[Stores]
.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),

若要完成Ferdinand的回答,请确保在API未完成加载数据之前,stores不是剩余的null

为了避免null异常初始化stores = [];或检查此答案https://stackoverflow.com/a/64894117/10663537

相关内容

  • 没有找到相关文章

最新更新