gpt4 book ai didi

android - 如何以编程方式将列表小部件添加到 TabBar?

转载 作者:IT王子 更新时间:2023-10-29 06:57:22 24 4
gpt4 key购买 nike

我正在构建一个连接并向 HTTP 服务器发送请求的应用程序,当获得响应时将它们解析为 JSON 对象并显示输出。当我使用以下方法时出现问题:

Future<List<Widget>> getPizzas() async {
List<Widget> pizzasElements;
await PizzeriaAPI().getMenu().then((response) {
Iterable list = json.decode(response.body);
var pizzas = list.map((model) => Pizza.fromJson(model)).toList();
pizzasElements =new List<Widget>.generate(pizzas.length, (int index){
Row row = new Row();
row.children.add(new Text(pizzas[index].name));
row.children.add(new Text("${pizzas[index].price} \$"));
row.children.add(new MaterialButton(color: Colors.green,child: Text("Add"),onPressed: (){
// esegui il post
}));
return row;
});
});
}

这是构建方法:

@override
Widget build(BuildContext context) {
getPizzas().then((List<Widget> response){
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
brightness: Brightness.dark,
),
home: DefaultTabController(length: 4, child: Scaffold(
appBar: AppBar(
title: const Text('Pizzeria'),
bottom: TabBar(
isScrollable: true,
tabs: [
Tab(text: "Buy"),
Tab(text: "Orders"),
Tab(icon: Icon(Icons.shopping_cart)),
Tab(icon: Icon(Icons.settings))
]
),
),
body: TabBarView(children: [
Column(
children: response,
),
Column(
children: <Widget>[
Row(
children: <Widget>[
Text("Orders")
],
)
],
),
Column(
children: <Widget>[
Row(
children: <Widget>[
Icon(Icons.shopping_cart)
],
)
],
),
Column(
children: <Widget>[
Row(
children: <Widget>[
Icon(Icons.settings)
],
)
],
)
]),
)
)
);
}
);
}
}

我获得的是 Future 对象而不是 List 对象。
用于显示元素的代码是:

Column(
children: response,
),

如何从该方法获取List并显示输出?

最佳答案

问题是 getPizzas() 是异步的,这意味着它返回一个 Future。您的要求本质上意味着您应该将渲染代码更改为:

Column(
children: pizzasElements,
),

因为您似乎正在设置 pizzaElements 以包含您的小部件列表。

更新:

您需要做的是将构建方法与请求分开。因此,在您的构建函数中,只需调用 getPizzas() 函数即可。像这样:

Widget build(BuildContext context) {
getPizzas();
return MaterialApp(...

接下来,您需要确保 pizzaElements 已初始化并且是类属性而不是局部变量。所以这意味着您需要使用 StatefulWidget 并且这将发生在 State 类中。

List<Widget> pizzaElements = <Widget>[];

然后在 getPizzas() 中,您需要确保调用 setState 以便让您的小部件与列表一起重新呈现:

void getPizzas() {
PizzeriaAPI().getMenu().then((response) {
Iterable list = json.decode(response.body);
var pizzas = list.map((model) => Pizza.fromJson(model)).toList();
setState(() {
pizzasElements = new List<Widget>.generate(pizzas.length, (int index) {
Row row = new Row();
row.children.add(new Text(pizzas[index].name));
row.children.add(new Text("${pizzas[index].price} \$"));
row.children.add(new MaterialButton(
color: Colors.green,
child: Text("Add"),
onPressed: () {
// esegui il post
}));
return row;
});
});
});
}

关于android - 如何以编程方式将列表小部件添加到 TabBar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55733226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com