我有下面的自定义小部件,使Switch
和读取其状态(真/假)
然后我将这个添加到我的主应用程序小部件(父),我怎么能让父知道开关的值!
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
(parent)文件中,我从以下内容开始:
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();
//...
}
9条答案
按热度按时间wlzqhblo1#
第一种可能性是将回调传递给子窗口,第二种可能性是对有状态小部件使用
of
模式。见下文。还有一种方法是使用InheritedWidget而不是StatefulWidget;如果你想让你的子部件在父部件的数据改变并且父部件不是直接的父部件时重建,这是特别有用的。参见inherited widget documentation
8tntrjer2#
我认为通知是一个相当文明的解决方案,它们允许一个非常干净的沟通,没有变量杂耍,如果你需要它们,它们会冒泡:
定义通知:
在孩子的事件处理程序中引发通知:
最后,使用通知侦听器 Package 您的父级:
ddarikpa3#
在2020年,投票最高的答案中的函数被标记为已弃用。这是基于这个答案的修正方案。
然而,在这个问题的答案中提到的方法有一个缺点。doc:
但是,一般来说,考虑使用一个回调来触发祖先中的有状态更改,而不是使用此方法所隐含的命令式样式。这通常会导致更易于维护和可重用的代码,因为它将小部件彼此解耦。
调用这个方法的开销相对较大(树的深度为O(N))。仅当已知此小部件到所需祖先的距离很小且有界时,才调用此方法。
nbysray54#
您可以将父小部件中定义的回调传递给子小部件,一旦在子小部件中执行了某个操作,就会调用回调。
zu0ti5jz5#
使用
InheritedWidget
-https://api.flutter.dev/flutter/widgets/InheritedWidget-class.html这使您可以访问所有子对象中父对象的数据
blmhpbnm6#
我找到了一个方法来做到这一点,这是相当简单的,我是一个扑菜鸟,所以也许这不是最好的方法。如果有人看到它有什么问题,请随时发表评论。基本上,状态是在父控件中设置的,子控件更新父控件的状态,并且当值更新时,使用状态值的父控件的任何子控件被重新绘制。
父控件:
ChildWhichMakesChanges(此示例使用文本框输入):
在ChildWhichUsesChanges中使用已更改的字符串值:
nc1teljy7#
2022解决方案:很简单的一个。
让它像***接口***一样工作。
你可以通过定义typedef来创建你自己的回调函数。它将只是作为一个接口之间的子父部件。
以下是Parent Widget:
以下是一个子Widget代码:
在这个例子中,我们从子警报对话框小部件中选择颜色,并传递给父小部件。
8e2ybdfx8#
为了将数据从子节点传递到父节点,我想使用我在应用程序中使用的最简单的方法,例如创建自定义按钮和其他回调小部件。所以(1)第一个例子是拥有子对象StatelessWidget,(2)第二个例子是拥有子对象StatefulWidget,并希望将数据传递给父对象。让我们从StatelessWidget开始:(一)
在父控件中将其用作:
(2)现在一个子控件作为StatefulWidget传递一些数据给父控件,像这样。例如,这里是一些DropdownWidget传递选定的字符串,例如:
在父Widget中使用它:
}
}}
epfja78i9#
将子部件中的值存储在共享首选项中,然后访问父部件中的共享首选项值。