【问题标题】:Passing data from one widget to another将数据从一个小部件传递到另一个小部件
【发布时间】:2020-02-22 08:52:45
【问题描述】:

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

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

【问题讨论】:

    标签: flutter flutter-widget


    【解决方案1】:

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

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

    像这样:

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

    那么你可以这样做:

    AddCash(selectedItem)
    

    确保在_AddCashPageState 中声明selectedItem 变量,我在您的代码中没有看到它。

    【讨论】:

      【解决方案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});
      } 
      

      【讨论】:

      • 或者您可以使用 _AddCashPageState 中的 choiceChipWidget 作为 widget.choiceChipWidget,正如 Jay Mungara 所说。
      • choiceChipWidget_AddCashPageState 下返回 null
      【解决方案3】:

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

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

      一样使用它

      AddCashPage 类中提供的任何属性/方法 都可以使用widget.ChoiceChipWidget_AddCashPageState() 中访问/strong> 属性;

      您只能在 initState()build()dispose()widget 属性/strong> 等等。

      【讨论】:

      • 我不想使用选择小部件本身。我想使用该小部件中的数据selectedChoice。并将其传递给_AddCashPageState。具体添加到String repetition = //PASS selectedChoice这里
      • 那么你应该只在构造函数中传递 selectedChoice 并使用 widget.selectedChoice 在 State 类中获取数据
      猜你喜欢
      • 2021-09-26
      • 2020-08-08
      • 2021-12-31
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2020-02-21
      相关资源
      最近更新 更多