【发布时间】:2019-10-16 16:56:21
【问题描述】:
我有一个 Column 小部件,其中包含一个自定义小部件 (ViewCard) 和一个 RaisedButton。 ViewCard 中有一些数据可供用户交互和更改。现在,我希望 RaisedButton 将这些更改或详细信息提交到 Firestore。我现在面临的问题是我无法从外部访问自定义小部件的数据。
Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
SizedBox(height: 20,),
ViewCard(args.combo,_changeprice),
SizedBox(height: 20,),
Container(
padding: EdgeInsets.only(top: 15),
height: 75,
decoration: BoxDecoration(
color: Colors.yellow,
borderRadius: BorderRadius.circular(20)
),
child: Card(
elevation: 0,
color: Colors.transparent,
child: Row(
children: <Widget>[
Text("Cart price : $price"),
SizedBox(width: 75,),
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25),
color: Colors.yellow
),
child: RaisedButton(
onPressed: (){},
child: Text("Host this order"),
),
),
],)
),
)
],
),
我需要以某种方式将 CardView 内部的 3 个变量传递给当前类,以便我可以在 RaisedButton 中使用它们。
edit : args.combo 是 Combo 类型
class Combo {
List<Items> items;
Combo({this.items});
}
class Items {
String item;
String price;
}
这是 CardView 的代码。此类为 args.combo 创建了一张卡片
class ViewCard extends StatefulWidget {
ViewCard(this.combo, this.changePrice);
final Combo combo;
final IntCallback changePrice;
@override
_ViewCardState createState() => _ViewCardState();
}
class _ViewCardState extends State<ViewCard> {
@override
Widget build(BuildContext context) {
return Container(
height: (50 * widget.combo.items.length + 125).toDouble(),
padding: EdgeInsets.only(left: 20),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(40), color: Colors.yellow),
child: Card(
elevation: 0,
color: Colors.transparent,
child: Column(children: <Widget>[
ListView.builder(
shrinkWrap: true,
itemCount: widget.combo.items.length,
physics: NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
return Column(
children: <Widget>[
SizedBox(
height: 25,
),
OneItem(widget.combo, index, widget.changePrice),
],
);
},
),
])),
);
}
}
OneItem 是另一个类,它遍历组合以查找其中的项目数。每个项目与一个复选框一起打印在一行中。用户选择了一些复选框,我需要将这些数据传递给最顶层的类。
class OneItem extends StatefulWidget {
OneItem(this.combo, this.index, this.changePrice);
final Combo combo;
final int index;
final Function changePrice;
double priceval;
@override
State<StatefulWidget> createState() => OneItemState();
}
class OneItemState extends State<OneItem> {
List<bool> Vals = new List();
@override
void initState() {
super.initState();
int count = widget.combo.items.length;
Vals = List<bool>.generate(count, (_) => false);
}
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
Align(
child: Text(widget.combo.items[widget.index].item),
alignment: Alignment(-1, 0),
),
Align(
child: Text(widget.combo.items[widget.index].price),
alignment: Alignment(0.1, 0)),
Align(
child: Checkbox(
value: Vals[widget.index],
onChanged: (bool value) {
setState(() {
Vals[widget.index] = value;
if(value == true){ widget.priceval = double.parse(widget.combo.items[widget.index].price); }
else{double val = double.parse(widget.combo.items[widget.index].price);
widget.priceval = -1*val;}
widget.changePrice(widget.priceval);
print('${widget.priceval}');
});
},
),
alignment: Alignment(0.6, 0)),
],
);
}
}
【问题讨论】: