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

时间:2019-10-26 04:33:54

标签: flutter flutter-widget

我有一个Choice小部件列表,想将选定的选项传递给另一个小部件。 这是选择小部件的列表

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 个答案:

答案 0 :(得分:4)

我认为您只是想念这里的setState():

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

赞:

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

然后您可以执行以下操作:

AddCash(selectedItem)

请确保在selectedItem中声明_AddCashPageState变量,但在您的代码中看不到它。

答案 1 :(得分: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});
} 

答案 2 :(得分:2)

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

对于Ex:要在班级中使用选择筹码小部件,您可以像 widget.ChoiceChipWidget

一样使用它。

AddCashPage 类中提供的任何属性/方法都可以使用 widget.ChoiceChipWidget <>在其状态类 _AddCashPageState()中进行访问。 / strong>属性;

您只能在方法中使用此 widget 属性,例如 initState() build() dispose()< / strong>等。