如何创建包装器小部件并将子项和属性传递给它
How to create a wrapper widget and pass children and properties to it in flutter
我有两个布局相同的页面
在 React 中,我会创建一个包装器,导入它并传递子项,因此两个页面共享相同的包装器。
<Wrapper someproperty={1}>
<div>content page 1</div>
</Wrapper>
<Wrapper someproperty={2}>
<div>content page 2</div>
</Wrapper>
在 flutter 中有对应的吗?非常欢迎任何其他选项,例如共享 class 之类的,谢谢
当然可以。
创建一个 Stateful-Widget 这是您的包装器。使用标志扩展此小部件,即 int-value。还用一个函数扩展这个 Wrapper 来切换标志并在这个函数中调用 setState() 。将此函数传递给 children,以便他们可以更改值。
包装器:
class ScrnWrapper extends StatefulWidget {
@override
_ScrnWrapperState createState() => _ScrnWrapperState();
}
class _ScrnWrapperState extends State<ScrnWrapper> {
int flag = 0;
_switchFlag(int newValue){
setState(() {
flag = newValue;
});
}
@override
Widget build(BuildContext context) {
return (flag == 0) ? ChildA(_switchFlag) : ChildB(_switchFlag);
}
}
Child甲/乙
class ChildA extends StatelessWidget {
final Function _switchFlag;
WdgtAnwurfOverviewTeam(
this._switchFlag,
);
}
现在您可以从 child-Widget 调用 _switchFlag。状态正在更新,树正在用您想要的内容重建。
通常我使用 Class 元数据。
文档:https://api.flutter.dev/flutter/widgets/MetaData-class.html
用法示例:
class CustomText extends StatelessWidget {
const CustomText({
Key key,
this.text,
}) : super(key: key);
final String text;
@override
Widget build(BuildContext context) {
final WrapperWidget wrapperWidget = context.findAncestorWidgetOfExactType();
return Text(
"text ${wrapperWidget.metaData.toString()}" ??
wrapperWidget.metaData.toString(),
);
}
}
class WrapperWidget extends MetaData {
const WrapperWidget({
Widget child,
int someProperty,
}) : super(
child: child,
metaData: someProperty,
);
}
/// declaration
final component = WrapperWidget(
child: CustomText(text: "content page"), someProperty: 1);
我有两个布局相同的页面
在 React 中,我会创建一个包装器,导入它并传递子项,因此两个页面共享相同的包装器。
<Wrapper someproperty={1}>
<div>content page 1</div>
</Wrapper>
<Wrapper someproperty={2}>
<div>content page 2</div>
</Wrapper>
在 flutter 中有对应的吗?非常欢迎任何其他选项,例如共享 class 之类的,谢谢
当然可以。 创建一个 Stateful-Widget 这是您的包装器。使用标志扩展此小部件,即 int-value。还用一个函数扩展这个 Wrapper 来切换标志并在这个函数中调用 setState() 。将此函数传递给 children,以便他们可以更改值。
包装器:
class ScrnWrapper extends StatefulWidget {
@override
_ScrnWrapperState createState() => _ScrnWrapperState();
}
class _ScrnWrapperState extends State<ScrnWrapper> {
int flag = 0;
_switchFlag(int newValue){
setState(() {
flag = newValue;
});
}
@override
Widget build(BuildContext context) {
return (flag == 0) ? ChildA(_switchFlag) : ChildB(_switchFlag);
}
}
Child甲/乙
class ChildA extends StatelessWidget {
final Function _switchFlag;
WdgtAnwurfOverviewTeam(
this._switchFlag,
);
}
现在您可以从 child-Widget 调用 _switchFlag。状态正在更新,树正在用您想要的内容重建。
通常我使用 Class 元数据。
文档:https://api.flutter.dev/flutter/widgets/MetaData-class.html
用法示例:
class CustomText extends StatelessWidget {
const CustomText({
Key key,
this.text,
}) : super(key: key);
final String text;
@override
Widget build(BuildContext context) {
final WrapperWidget wrapperWidget = context.findAncestorWidgetOfExactType();
return Text(
"text ${wrapperWidget.metaData.toString()}" ??
wrapperWidget.metaData.toString(),
);
}
}
class WrapperWidget extends MetaData {
const WrapperWidget({
Widget child,
int someProperty,
}) : super(
child: child,
metaData: someProperty,
);
}
/// declaration
final component = WrapperWidget(
child: CustomText(text: "content page"), someProperty: 1);