0

我有一个选择小部件列表,并希望将选定的选择传递给另一个小部件。这是选择小部件的列表

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();
}
4

3 回答 3

4

我想你只是错过了在这里调用 setState() :

  ChoiceChipWidget(chipList, (item) {
          selectedItem = item;
        }),

像这样:

  ChoiceChipWidget(chipList, (item) {
          setState(() => selectedItem = item);
        }),

然后你可以这样做:

AddCash(selectedItem)

确保在selectedItem里面声明变量_AddCashPageState,我在你的代码上看不到它。

于 2019-10-26T05:02:31.167 回答
2

您的选择小部件通过您创建的构造函数将数据传递给 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});
} 
于 2019-10-26T04:50:58.733 回答
2

要在_AddCashPageState类中使用您传递的数据,您可以使用相关 Stateful 类的相应状态的小部件属性。

例如:要在您的班级中使用选择芯片小部件,您可以像widget.ChoiceChipWidget一样使用它

AddCashPage类中提供的任何属性/方法都可以使用widget.ChoiceChipWidget属性在其 State 类_AddCashPageState()中访问;

您只能在initState()build()dispose()等方法中使用此小部件属性。

于 2019-10-26T04:59:08.807 回答