如何在颤动中从未来构建下拉列表
How to build dropdown list from future in flutter
我想从 Future 构建下拉列表,这是我的简单列表视图功能,它正在工作,但是如何从中填充下拉列表,我真的很困惑这个列表映射等来自php背景,
child: FutureBuilder(
future:userApi.getUsers(),
builder: (BuildContext context, AsyncSnapshot snapshot){
if(snapshot.data == null){
return Container(
child: Center(
child: Text("Loading...")
)
);
} else {
return Container(
child: DropdownButton(
items: snapshot.data.map((item) {
return DropdownMenuItem(child: Text(item.title));
}).toList(),
onChanged: (value){},
)
);
}
},
),
class UserApi{
Future<List<User>>getUsers() async {
var data = await http.get("https://jsonplaceholder.typicode.com/albums/");
var jsonData = json.decode(data.body);
List<User> users = [];
for(var u in jsonData){
User user = User(u["id"], u["title"]);
users.add(user);
}
return users;
}
class User {
final int id;
final String title;
User(this.id,this.title);
}
您可以在任何转换列表元素的列表上调用 map 函数。
return DropdownButton(
items: snapshot.data.map((item) {
return DropdownMenuItem(child: Text(item.title));
}).toList(),
onChanged: (value){},
);
如果您在这里看到,我们正在通过在 snapshot.data 上调用 map 将列表 snapshot.data 转换为另一个 DropdownMenuItem 类型列表,map 函数采用另一个函数,该函数在 [的每个元素上调用=17=] ,映射 returns 类型为 DropdownMenuItem 的 Iterable(在每个元素上调用的函数的返回类型),我们通过调用 toList() 将 Iterable 转换为列表
我希望这足以解释,地图功能非常有用。
好的,我刚刚阅读了上面留下的评论,如果您的问题是获取数据,那么这可能对您没有帮助,但如果快照有数据,这将有效
//initialize this outside your build method
String dropDownValue;
FutureBuilder(
future:userApi.getUsers(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
return snapshot.hasData
? Container(
child: DropdownButton<String>(
hint: Text(dropDownValue ?? 'Make a selection'),
items: snapshot.data.map<DropdownMenuItem<String>>((item) {
return DropdownMenuItem<String>(
value: item.title,
child: Text(item.title),
);
}).toList(),
onChanged: (value) {
setState(() {
dropDownValue = value;
print(value);
});
},
),
)
: Container(
child: Center(
child: Text('Loading...'),
),
);
},
),
我想从 Future 构建下拉列表,这是我的简单列表视图功能,它正在工作,但是如何从中填充下拉列表,我真的很困惑这个列表映射等来自php背景,
child: FutureBuilder(
future:userApi.getUsers(),
builder: (BuildContext context, AsyncSnapshot snapshot){
if(snapshot.data == null){
return Container(
child: Center(
child: Text("Loading...")
)
);
} else {
return Container(
child: DropdownButton(
items: snapshot.data.map((item) {
return DropdownMenuItem(child: Text(item.title));
}).toList(),
onChanged: (value){},
)
);
}
},
),
class UserApi{
Future<List<User>>getUsers() async {
var data = await http.get("https://jsonplaceholder.typicode.com/albums/");
var jsonData = json.decode(data.body);
List<User> users = [];
for(var u in jsonData){
User user = User(u["id"], u["title"]);
users.add(user);
}
return users;
}
class User {
final int id;
final String title;
User(this.id,this.title);
}
您可以在任何转换列表元素的列表上调用 map 函数。
return DropdownButton(
items: snapshot.data.map((item) {
return DropdownMenuItem(child: Text(item.title));
}).toList(),
onChanged: (value){},
);
如果您在这里看到,我们正在通过在 snapshot.data 上调用 map 将列表 snapshot.data 转换为另一个 DropdownMenuItem 类型列表,map 函数采用另一个函数,该函数在 [的每个元素上调用=17=] ,映射 returns 类型为 DropdownMenuItem 的 Iterable(在每个元素上调用的函数的返回类型),我们通过调用 toList() 将 Iterable 转换为列表
我希望这足以解释,地图功能非常有用。
好的,我刚刚阅读了上面留下的评论,如果您的问题是获取数据,那么这可能对您没有帮助,但如果快照有数据,这将有效
//initialize this outside your build method
String dropDownValue;
FutureBuilder(
future:userApi.getUsers(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
return snapshot.hasData
? Container(
child: DropdownButton<String>(
hint: Text(dropDownValue ?? 'Make a selection'),
items: snapshot.data.map<DropdownMenuItem<String>>((item) {
return DropdownMenuItem<String>(
value: item.title,
child: Text(item.title),
);
}).toList(),
onChanged: (value) {
setState(() {
dropDownValue = value;
print(value);
});
},
),
)
: Container(
child: Center(
child: Text('Loading...'),
),
);
},
),