在简单的 Flutter 应用程序中使用 Column 中的 GridViews 的问题
Issues using GridViews in Column in simple Flutter application
我最近开始学习 flutter,因此正在构建一个教学应用程序,我称之为 "Basketly"。
UI的结构非常简单:
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Basketly - dein Einkauf'),
actions: <Widget>[
new FlatButton.icon(
label: new Text("Einstellungen"),
onPressed: () {
/*nav to settings */
Navigator.push(context,
MaterialPageRoute(builder: (context) => SettingsView()));
},
icon: new Icon(Icons.settings),
),
],
),
body: new Column(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
new Text(
"Einkaufswagen",
style: new TextStyle(
fontSize: 12.0,
color: Colors.amber,
fontWeight: FontWeight.w600,
fontFamily: "Roboto"),
),
Expanded(
child: new GridView.count(
crossAxisCount: 6,
children: this.widget.basketItems,
),
),
new Divider(color: Colors.grey),
new Text(
"Produkte",
style: new TextStyle(
fontSize: 12.0,
color: Colors.amber,
fontWeight: FontWeight.w600,
fontFamily: "Roboto"),
),
new GridView.count(
crossAxisCount: 6,
children: this.widget.allItems,
shrinkWrap: true),
new Divider(color: Colors.grey),
//TODO here we input some expandeable gridviews or something
new MetaProdCategory("Reinigungsmittel"),
new MetaProdCategory("Getränke"),
new MetaProdCategory("Obst"),
new MetaProdCategory("Milch & Käse"),
new MetaProdCategory("Gemüse"),
new Row( children: <Widget>[
new Switch(onChanged: switchChanged, value: false),
new Text("Vegan"),
new Switch(onChanged: switchChanged, value: false),
new Text(
"Bio",
),
new Switch(onChanged: switchChanged, value: false),
new Text(
"Regional",
),
new Switch(onChanged: switchChanged, value: false),
new Text(
"Fair",
),
]),
]));
我想要的功能如图所示:如果您点击 "Produkte" 中的其中一个图标 (ProdCategory),它将从 "Produkte" 中删除并添加到 "Einkaufswagen" 中,并且反之亦然。它应该作为简单的购物清单。
因此我实施了:
List<ProdCategory> basketItems; // the items currently in the basket
List<ProdCategory> allItems; // all Items
...用作保存 ProdCategory 项目的数据结构。
并从列表中回调 add/remove 它们:
// updates the current basket by adding a productCategory to it
// (and removing from allItems)
addToBasket(ProdCategory prod) {
setState(() {
log("addToBasket called");
prod.upOrDown = !prod.upOrDown;
this.widget.basketItems.add(prod);
this.widget.allItems.remove(prod);
});
..包括一些日志记录,以确保一切按预期工作:
log("---------basketItems:");
this.widget.basketItems.forEach((element) {
log(element.stringify());
});
log("----------allItems:");
this.widget.allItems.forEach((element) {
log(element.stringify());
});
现在进入正题!
当我选择其中一个 ProdCategories(在本例中为 Brot)时,根据日志,一切都按预期工作:
[log] you tapped on Brot
[log] addToBasket called
[log] ---------basketItems:
[log] Brot true
[log] ----------allItems:
[log] Bier false
[log] Senf false
[log] Lauch false
[log] Steak false
[log] Bergkäse false
[log] Mehl false
[log] Kürbis false
[log] Oliven false
[log] Pfeffer false
如您所见,Brot 现在位于 basketItems 中,并已从 allItems 中删除 - 正如预期的那样。
...但是不知何故,UI 在 Einkaufswagen GridView 中不显示 Brot。
我不知道我做错了什么,几个小时以来一直在努力解决这个问题,但没有成功。
似乎 Flutter 中围绕 GridView 存在很多错误,尤其是在 Column 中使用时 --- 但我怀疑必须有一个适当的解决方案来满足我需要的可用性?
这个怎么样?
new GridView.builder(
itemBuilder: (BuildContext context, int index) {
return this.widget.basketItems[index];
},
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
),
itemCount: this.widget.basketItems.length,
shrinkWrap: true),
和
new GridView.builder(
itemBuilder: (BuildContext context, int index) {
return this.widget.allItems[index];
},
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 6,
),
itemCount: this.widget.allItems.length,
shrinkWrap: true),
我最近开始学习 flutter,因此正在构建一个教学应用程序,我称之为 "Basketly"。
UI的结构非常简单:
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Basketly - dein Einkauf'),
actions: <Widget>[
new FlatButton.icon(
label: new Text("Einstellungen"),
onPressed: () {
/*nav to settings */
Navigator.push(context,
MaterialPageRoute(builder: (context) => SettingsView()));
},
icon: new Icon(Icons.settings),
),
],
),
body: new Column(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
new Text(
"Einkaufswagen",
style: new TextStyle(
fontSize: 12.0,
color: Colors.amber,
fontWeight: FontWeight.w600,
fontFamily: "Roboto"),
),
Expanded(
child: new GridView.count(
crossAxisCount: 6,
children: this.widget.basketItems,
),
),
new Divider(color: Colors.grey),
new Text(
"Produkte",
style: new TextStyle(
fontSize: 12.0,
color: Colors.amber,
fontWeight: FontWeight.w600,
fontFamily: "Roboto"),
),
new GridView.count(
crossAxisCount: 6,
children: this.widget.allItems,
shrinkWrap: true),
new Divider(color: Colors.grey),
//TODO here we input some expandeable gridviews or something
new MetaProdCategory("Reinigungsmittel"),
new MetaProdCategory("Getränke"),
new MetaProdCategory("Obst"),
new MetaProdCategory("Milch & Käse"),
new MetaProdCategory("Gemüse"),
new Row( children: <Widget>[
new Switch(onChanged: switchChanged, value: false),
new Text("Vegan"),
new Switch(onChanged: switchChanged, value: false),
new Text(
"Bio",
),
new Switch(onChanged: switchChanged, value: false),
new Text(
"Regional",
),
new Switch(onChanged: switchChanged, value: false),
new Text(
"Fair",
),
]),
]));
我想要的功能如图所示:如果您点击 "Produkte" 中的其中一个图标 (ProdCategory),它将从 "Produkte" 中删除并添加到 "Einkaufswagen" 中,并且反之亦然。它应该作为简单的购物清单。
因此我实施了:
List<ProdCategory> basketItems; // the items currently in the basket
List<ProdCategory> allItems; // all Items
...用作保存 ProdCategory 项目的数据结构。
并从列表中回调 add/remove 它们:
// updates the current basket by adding a productCategory to it
// (and removing from allItems)
addToBasket(ProdCategory prod) {
setState(() {
log("addToBasket called");
prod.upOrDown = !prod.upOrDown;
this.widget.basketItems.add(prod);
this.widget.allItems.remove(prod);
});
..包括一些日志记录,以确保一切按预期工作:
log("---------basketItems:");
this.widget.basketItems.forEach((element) {
log(element.stringify());
});
log("----------allItems:");
this.widget.allItems.forEach((element) {
log(element.stringify());
});
现在进入正题!
当我选择其中一个 ProdCategories(在本例中为 Brot)时,根据日志,一切都按预期工作:
[log] you tapped on Brot
[log] addToBasket called
[log] ---------basketItems:
[log] Brot true
[log] ----------allItems:
[log] Bier false
[log] Senf false
[log] Lauch false
[log] Steak false
[log] Bergkäse false
[log] Mehl false
[log] Kürbis false
[log] Oliven false
[log] Pfeffer false
如您所见,Brot 现在位于 basketItems 中,并已从 allItems 中删除 - 正如预期的那样。
...但是不知何故,UI 在 Einkaufswagen GridView 中不显示 Brot。
我不知道我做错了什么,几个小时以来一直在努力解决这个问题,但没有成功。 似乎 Flutter 中围绕 GridView 存在很多错误,尤其是在 Column 中使用时 --- 但我怀疑必须有一个适当的解决方案来满足我需要的可用性?
这个怎么样?
new GridView.builder(
itemBuilder: (BuildContext context, int index) {
return this.widget.basketItems[index];
},
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
),
itemCount: this.widget.basketItems.length,
shrinkWrap: true),
和
new GridView.builder(
itemBuilder: (BuildContext context, int index) {
return this.widget.allItems[index];
},
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 6,
),
itemCount: this.widget.allItems.length,
shrinkWrap: true),