将数据从一个小部件传递到另一个小部件
Passing data from one widget to another
我有一个选择小部件列表,想将选定的选项传递给另一个小部件。
这是选择小部件的列表
class ChoiceChipWidget extends StatefulWidget {
final List<String> reportList;
final Function(String item) onChoiceSelected;
ChoiceChipWidget(this.reportList, this.onChoiceSelected);
@override
_ChoiceChipWidgetState createState() => new _ChoiceChipWidgetState();
}
class _ChoiceChipWidgetState extends State<ChoiceChipWidget> {
String selectedChoice = "";
_buildChoiceList() {
List<Widget> choices = List();
widget.reportList.forEach((item) {
choices.add(Container(
child: ChoiceChip(
label: Text(item),
selected: selectedChoice == item,
onSelected: (selected) {
setState(() {
selectedChoice = item;
widget.onChoiceSelected(item);
print(selectedChoice); //DATA THAT NEEDS TO BE PASSED
});
},
),
));
});
return choices;
}
@override
Widget build(BuildContext context) {
return Wrap(
children: _buildChoiceList(),
);
}
}
我需要将它传递给这个小部件
class AddCashPage extends StatefulWidget {
@override
_AddCashPageState createState() => _AddCashPageState();
}
class _AddCashPageState extends State<AddCashPage> {
void createTodo() async {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
String repetition = //DATA NEEDS TO GO HERE;
final addCash = AddCash(repetition);
setState(() {
id = addCash.id;
});
}
}
@override
Widget build(BuildContext context) {
return Container(
child: Form(
key: _formKey,
child: Column(
children: <Widget>[
Row(
children: <Widget>[
ChoiceChipWidget(chipList, (item) {
selectedItem = item;
}),
],
),
RaisedButton(
child: Text("Update Cash Flow"),
onPressed: createTodo,
),
],
),
),
);
}
}
我试着在里面做一个构造函数 AddCashPage
像这样
class AddCashPage extends StatefulWidget {
final ChoiceChipWidget choiceChipWidget;
AddCashPage({Key key, @required this.choiceChipWidget}) : super(key: key);
@override
_AddCashPageState createState() => _AddCashPageState();
}
您的选择小部件通过您创建的构造函数将数据传递给 AddCashPage,但您遗漏了一些东西。您需要将 AddCashPage 拥有的数据传递给它的状态 (_AddCashState),以便您可以在那里使用它。基本上,您需要再创建一个构造函数。
class AddCashPage extends StatefulWidget {
final ChoiceChipWidget choiceChipWidget;
AddCashPage({Key key, @required this.choiceChipWidget}) : super(key: key);
@override
_AddCashPageState createState() => _AddCashPageState(choiceChipWidget: choiceChipWidget);
}
并且在 _AddCashPageState 中:
class _AddCashPageState extends State<AddCashPage> {
final choiceChipWidget;
_AddCashPageState({Key key, @required this.choiceChipWidget});
}
要在 _AddCashPageState class 中使用您传递的数据,您可以使用相关 Stateful class 的相应状态的小部件 属性。
例如:要在 class 中使用选择芯片小部件,您可以像 widget.ChoiceChipWidget
那样使用它
properties/methods AddCashPage class 中提供的任何 properties/methods 都可以在其状态 class 中访问_AddCashPageState() 使用 widget.ChoiceChipWidget 属性;
您只能在方法内部使用此 小部件 属性,例如 initState()、build (), dispose()等
我想你只是错过了在这里调用 setState():
ChoiceChipWidget(chipList, (item) {
selectedItem = item;
}),
像这样:
ChoiceChipWidget(chipList, (item) {
setState(() => selectedItem = item);
}),
那么你可以这样做:
AddCash(selectedItem)
确保在 _AddCashPageState
中声明 selectedItem
变量,我在你的代码中没有看到它。
我有一个选择小部件列表,想将选定的选项传递给另一个小部件。 这是选择小部件的列表
class ChoiceChipWidget extends StatefulWidget {
final List<String> reportList;
final Function(String item) onChoiceSelected;
ChoiceChipWidget(this.reportList, this.onChoiceSelected);
@override
_ChoiceChipWidgetState createState() => new _ChoiceChipWidgetState();
}
class _ChoiceChipWidgetState extends State<ChoiceChipWidget> {
String selectedChoice = "";
_buildChoiceList() {
List<Widget> choices = List();
widget.reportList.forEach((item) {
choices.add(Container(
child: ChoiceChip(
label: Text(item),
selected: selectedChoice == item,
onSelected: (selected) {
setState(() {
selectedChoice = item;
widget.onChoiceSelected(item);
print(selectedChoice); //DATA THAT NEEDS TO BE PASSED
});
},
),
));
});
return choices;
}
@override
Widget build(BuildContext context) {
return Wrap(
children: _buildChoiceList(),
);
}
}
我需要将它传递给这个小部件
class AddCashPage extends StatefulWidget {
@override
_AddCashPageState createState() => _AddCashPageState();
}
class _AddCashPageState extends State<AddCashPage> {
void createTodo() async {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
String repetition = //DATA NEEDS TO GO HERE;
final addCash = AddCash(repetition);
setState(() {
id = addCash.id;
});
}
}
@override
Widget build(BuildContext context) {
return Container(
child: Form(
key: _formKey,
child: Column(
children: <Widget>[
Row(
children: <Widget>[
ChoiceChipWidget(chipList, (item) {
selectedItem = item;
}),
],
),
RaisedButton(
child: Text("Update Cash Flow"),
onPressed: createTodo,
),
],
),
),
);
}
}
我试着在里面做一个构造函数 AddCashPage
像这样
class AddCashPage extends StatefulWidget {
final ChoiceChipWidget choiceChipWidget;
AddCashPage({Key key, @required this.choiceChipWidget}) : super(key: key);
@override
_AddCashPageState createState() => _AddCashPageState();
}
您的选择小部件通过您创建的构造函数将数据传递给 AddCashPage,但您遗漏了一些东西。您需要将 AddCashPage 拥有的数据传递给它的状态 (_AddCashState),以便您可以在那里使用它。基本上,您需要再创建一个构造函数。
class AddCashPage extends StatefulWidget {
final ChoiceChipWidget choiceChipWidget;
AddCashPage({Key key, @required this.choiceChipWidget}) : super(key: key);
@override
_AddCashPageState createState() => _AddCashPageState(choiceChipWidget: choiceChipWidget);
}
并且在 _AddCashPageState 中:
class _AddCashPageState extends State<AddCashPage> {
final choiceChipWidget;
_AddCashPageState({Key key, @required this.choiceChipWidget});
}
要在 _AddCashPageState class 中使用您传递的数据,您可以使用相关 Stateful class 的相应状态的小部件 属性。
例如:要在 class 中使用选择芯片小部件,您可以像 widget.ChoiceChipWidget
那样使用它properties/methods AddCashPage class 中提供的任何 properties/methods 都可以在其状态 class 中访问_AddCashPageState() 使用 widget.ChoiceChipWidget 属性;
您只能在方法内部使用此 小部件 属性,例如 initState()、build (), dispose()等
我想你只是错过了在这里调用 setState():
ChoiceChipWidget(chipList, (item) {
selectedItem = item;
}),
像这样:
ChoiceChipWidget(chipList, (item) {
setState(() => selectedItem = item);
}),
那么你可以这样做:
AddCash(selectedItem)
确保在 _AddCashPageState
中声明 selectedItem
变量,我在你的代码中没有看到它。