颤振:是否可以替换小部件本身?



我有以下情况:

  • 带有第 1、2、3 行的主小部件
  • 在第 2 行中,我最初设置了小部件 A

我想要什么:

  • 一旦我在小部件 A 中发生了状态更改,就将小部件 A 替换为小部件 B
  • 在小部件 A 中处理替换,而不是在主小部件中处理
  • 替换(所以我不想使用小部件 A 的回调或观察全局状态并在主小部件中对其进行反应)
  • 替换意味着:小部件 B 仍然是主小部件的子项(在我的情况下,它停留在第二行并且不会像使用路线/导航器时那样全屏显示?

我对我想要的东西的理由:

  • 在主小部件的每一行中,用户可以与子菜单进行交互,例如在第 2 行中由 WidgetA -> [用户交互] -> WidgetB [用户交互] -> WidgetC 组成
  • 我不想从主小部件管理所有这些不同的状态

我尝试过:

//in Widget A -> in order to switch to Widget B
Navigator.push(context, new MaterialPageRoute(
builder: (_) => new WidgetB(),
));

这不会完成这项工作,因为小部件 B 不会保留在主小部件的 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 相当陌生,但我能想到的一种解决方法是 - 您将状态与小部件一起使用。例如,如果要根据用途显示两行,则可以根据需要设置一行的高度,并将第二行的高度设置为零。并按需交换。 当然,您还需要清空内容。例如,将文本设置为"等。 这可能不是理想的解决方案,但可能有效。

最新更新