将数据从一个小部件传递到另一个小部件

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 变量,我在你的代码中没有看到它。