dart – 如何将数据从子窗口小部件传递到其父窗口
发布时间:2020-12-14 14:55:53 所属栏目:百科 来源:网络整理
导读:我有下面的自定义小部件,它创建一个Switch并读取其状态(true / false) 然后我将这个添加到我的主应用程序小部件(父级),如何让父级知道交换机的值! import 'package:flutter/material.dart';class Switchy extends StatefulWidget{ Switchy({Key key}) : sup
我有下面的自定义小部件,它创建一个Switch并读取其状态(true / false)
然后我将这个添加到我的主应用程序小部件(父级),如何让父级知道交换机的值! import 'package:flutter/material.dart'; class Switchy extends StatefulWidget{ Switchy({Key key}) : super(key: key); @override State<StatefulWidget> createState() => new _SwitchyState(); } class _SwitchyState extends State<Switchy> { var myvalue = true; void onchange(bool value) { setState(() { this.myvalue = value; // I need the parent to receive this one! print('value is: $value'); }); } @override Widget build(BuildContext context) { return new Card( child: new Container( child: new Row( mainAxisAlignment: MainAxisAlignment.end,children: <Widget>[ new Text("Enable/Disable the app in the background",textAlign: TextAlign.left,textDirection: TextDirection.ltr,),new Switch(value: myvalue,onChanged: (bool value) => onchange(value)),],); } } 在main.dart(父)文件中,我从这开始: import 'widgets.dart'; import 'package:flutter/material.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Demo',theme: new ThemeData( primarySwatch: Colors.deepOrange,home: new MyHomePage(title: 'My App settup'),); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key,this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => new _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { Widget e = new Switchy(); //... } 解决方法
第一种可能性是将回调传递给您的孩子,第二种方法是使用of pattern作为您的有状态小部件.见下文.
import 'package:flutter/material.dart'; class MyStatefulWidget extends StatefulWidget { @override State<StatefulWidget> createState() => new MyStatefulWidgetState(); static MyStatefulWidgetState of(BuildContext context) { final MyStatefulWidgetState navigator = context.ancestorStateOfType(const TypeMatcher<MyStatefulWidgetState>()); assert(() { if (navigator == null) { throw new FlutterError( 'MyStatefulWidgetState operation requested with a context that does ' 'not include a MyStatefulWidget.'); } return true; }()); return navigator; } } class MyStatefulWidgetState extends State<MyStatefulWidget> { String _string = "Not set yet"; set string(String value) => setState(() => _string = value); @override Widget build(BuildContext context) { return new Column( children: <Widget>[ new Text(_string),new MyChildClass(callback: (val) => setState(() => _string = val)) ],); } } typedef void StringCallback(String val); class MyChildClass extends StatelessWidget { final StringCallback callback; MyChildClass({this.callback}); @override Widget build(BuildContext context) { return new Column( children: <Widget>[ new FlatButton( onPressed: () { callback("String from method 1"); },child: new Text("Method 1"),new FlatButton( onPressed: () { MyStatefulWidget.of(context).string = "String from method 2"; },child: new Text("Method 2"),) ],); } } void main() => runApp( new MaterialApp( builder: (context,child) => new SafeArea(child: new Material(color: Colors.white,child: child)),home: new MyStatefulWidget(),); 还有使用InheritedWidget而不是StatefulWidget的替代方法;如果您希望子窗口小部件重建,如果父窗口小部件的数据发生更改且父窗口不是直接父窗口,则此功能特别有用.见inherited widget documentation (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |