如何从其他小工具获取数据?

时间:2018-08-27 16:14:36

标签: dart flutter

我想从特定的小部件中获取数据,我搜索存在的SQLite或SharePreferences,但我猜不需要。

我想要的是,当我在事件onTap中单击时,以我为例,使用String并在父窗口小部件中获得String的值。我知道如何将数据从父级传递到子级小部件,但不能反向传递。

示例:!1

例如,当我按下“ Journey UNI”时,保存该String并将其放在父小部件中:

2

4 个答案:

答案 0 :(得分:3)

您可以让您的父母将回调函数传递给您的孩子小部件。 然后,在子小部件中,当您想将值传递回父级时,可以使用该值调用回调。

...
ParentWidget(
    child: ChildWidget(
        onSelectParam: (String param) {
            // do something with param
        }
    ),
)
...


class ChildWidget extends StatelessWidget {

    String yourParam;
    Function(String) onSelectParam;

    @override
    Widget build(BuildContext context) {
        return InkWell(
            onTap: () {
                onSelectParam(yourParam);
            },
            child: ...
        );
    }
}

答案 1 :(得分:1)

我们可以将回调用于子级小部件与父级小部件进行对话。请参考this示例。这里FeedPage是父母,System.setProperty("http.agent", "curl/7.51.0"). 是孩子。

答案 2 :(得分:1)

使用回调在小部件之间传递/接收数据

例如,您声明一个回调和一个模型类,其中包含要传递给子窗口小部件的数据。 以下是子窗口小部件的代码

class CustomerInformation extends StatefulWidget {
  CustomerInformation({Key key, this.paymentModel, this.onContinue})
      : super(key: key);

  final VoidCallback onContinue;
  final PullPaymentData paymentModel;

  @override
  State<StatefulWidget> createState() {
    return _CustomerInformationState();
  }
}

    class _CustomerInformationState extends State<CustomerInformation> {
//useless code omitted
            Padding(
              padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
              child: RaisedButton(
                onPressed: () async {
                    widget.onContinue();
                  }
                },
                child: Text(
                  Translations.of(context).sendOtpButton,
                ),
              ),
            ),
//useless code omitted
  }

paymentModel将作为Ref传递,并且在上述代码中的RaisedButton被按下时,控制权被转移回调用方(父级),后者接收更新的模型:

以下是调用上面的小部件的调用方(父)小部件的示例代码

    class _PullPaymentScreenState extends State<PullPaymentScreen> {
  PullPaymentData model = PullPaymentData(
      identifier: "", isSendOtpSuccess: false, amount: "", currentStep: 0);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: getAppBar(),
        body: Builder(builder: (BuildContext context) {
          return Column(
            children: <Widget>[
              model.currentStep == 0
                  ? CustomerInformation(
                      paymentModel: model,
                      onContinue: () {
//i recieve updated model HERE
                        setState(() {
                          if (model.isSendOtpSuccess) { 
                            ++model.currentStep;
                            Scaffold.of(context).showSnackBar(SnackBar(
                                  content:
                                      Text(Translations.of(context).otpSuccess),
                                  duration: Duration(seconds: 4),
                                ));
                          }
                        });
                      })
                  : SubmitPayment(
                      identifier: model.identifier,
                      amount: model.amount,
                      onResendPressed: () {
                        setState(() {
                          --model.currentStep;
                        });
                      },
                    ),
            ],
          );
        }));
  }

答案 3 :(得分:0)

有关简单类型,您可以参考@tudorprodan

如果要获取所创建的包含textField的小部件的值,则将TextEditingController传递给小部件的构造函数。因此,您可以从小部件外部使用控制器来获取值。另外,请记住在完成后处置控制器。