Передача данных из одного виджета в другой - PullRequest
0 голосов
/ 26 октября 2019

У меня есть список виджетов выбора и я хочу передать выбранный виджет другому виджету. Вот список выбора виджетов

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

Ответы [ 3 ]

4 голосов
/ 26 октября 2019

Я думаю, вы просто пропустили вызов setState () здесь:

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

Примерно так:

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

Тогда вы можете сделать это:

AddCash(selectedItem)

Обязательно объявите переменную selectedItem внутри _AddCashPageState, я не вижу ее в вашем коде.

2 голосов
/ 26 октября 2019

Чтобы использовать переданные вами данные внутри _AddCashPageState класса, вы можете использовать свойство виджета соответствующего состояния соответствующего класса Stateful.

Например: чтобы использовать выбранный виджет чипа в своем классе, выможно использовать как widget.ChoiceChipWidget

Любые свойства / методы , предоставляемые в AddCashPage , доступны в классе State _AddCashPageState. () с использованием widget.ChoiceChipWidget свойство;

Вы можете использовать это свойство widget только внутри методов, например, initState () , build () , dispose () и т. Д.

2 голосов
/ 26 октября 2019

Выбранный вами виджет передает данные в 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});
} 
...