我想从特定的小部件中获取数据,我搜索存在的SQLite或SharePreferences,但我猜不需要。
我想要的是,当我在事件onTap中单击时,以我为例,使用String并在父窗口小部件中获得String的值。我知道如何将数据从父级传递到子级小部件,但不能反向传递。
示例:!1
例如,当我按下“ Journey UNI”时,保存该String并将其放在父小部件中:
!2
答案 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传递给小部件的构造函数。因此,您可以从小部件外部使用控制器来获取值。另外,请记住在完成后处置控制器。