颤动:小部件可以替代自己吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了颤动:小部件可以替代自己吗?相关的知识,希望对你有一定的参考价值。
我有以下情况:
- 第1,2,3行的主要小部件
- 在第2行中,我最初设置了Widget A.
我想要的是:
- 在Widget A中进行状态更改后,将Widget A替换为Widget B.
- 处理Widget A中的替换而不是主Widget中的替换(因此我不想使用Widget A中的回调或观察全局状态并在主Widget中对其做出反应)
- 替换意味着:小部件B仍然是主Widget的子节点(在我的情况下,保留在第二行并且不会全屏显示,因为使用routes / Navigator的情况就是这样吗?)
我的理由是我想要的:
- 在主小部件的每一行中,用户可以与子菜单进行交互,例如,第2行包含WidgetA - > [用户交互] - > WidgetB [用户交互] - > WidgetC
- 我不想从主要小部件管理所有这些不同的状态
我尝试了什么:
//in Widget A -> in order to switch to Widget B
Navigator.push(context, new MaterialPageRoute(
builder: (_) => new WidgetB(),
));
这不起作用,因为Widget B不会停留在主Widget的WidgetTree中
如果这是不可能的,我想现在实现我想要的是什么样的扑动方式:-)
答案
你需要有一些知道这个子导航的父母。您无法真正替换视图本身,它的父级是树中对该窗口小部件的引用,因此父级需要传达此信息以进行抖动。
也就是说,您可以制作一个自定义小部件,其工作是监听子事件,并相应地更改子级。
App
/
Row Row
|
WidgetParent
|
WidgetA
在这里WidgetParent
可以保持例如一个Listenable
并将ChangeNotifier
传递给WidgetA
。当WidgetA
决定WidgetX
应该进入屏幕时,它可以将其发送给父母。
class WidgetParent extends AnimatedWidget {
WidgetParent() : super(listenable: ValueNotifier<Widget>(null));
ValueNotifier<Widget> get notifier => listenable as ValueNotifier<Widget>;
Widget build(BuildContext context) {
return new Center(child: notifier.value ?? WidgetA(notifier));
}
}
现在,子小部件可以通知下一个人。
class WidgetA extends StatelessWidget {
WidgetA(this.notifier);
final ValueNotifier<Widget> notifier;
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: () => notifier.value = WidgetB(notifier),
child: Text("This is A, go to B"),
);
}
}
class WidgetB extends StatelessWidget {
WidgetB(this.notifier);
final ValueNotifier<Widget> notifier;
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: () => notifier.value = WidgetA(notifier),
child: Text("This is B, go to A"),
);
}
}
另一答案
我对Flutter相当新,但我能想到的一个解决方法是 - 你将状态与小部件一起使用。例如,如果要根据用途显示两行,则根据需要设置一行的高度,并将第二行的高度设置为零。并按需交换。当然,您也需要清空内容。例如将文本设置为''等。这可能不是理想的解决方案,但可以工作。
以上是关于颤动:小部件可以替代自己吗?的主要内容,如果未能解决你的问题,请参考以下文章