我是个新手。我使用的是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