颤动:小部件可以替代自己吗?

时间:2018-03-15 17:55:27

标签: layout widget dart flutter navigator

我有以下情况:

  • 包含行1,2,3
  • 的主要小部件
  • 在第2行中,我最初设置了Widget A

我想要的是什么:

  • 在窗口小部件A中更改状态后,将窗口小部件A替换为窗口小部件B
  • 处理Widget A中的替换而不是主Widget中的替换(因此我不想使用Widget A中的回调或观察全局状态并在主Widget中对其做出反应)
  • 替换意味着:小部件B仍然是主Widget的子节点(在我的情况下,它停留在第二行并且不会全屏显示,因为使用路由/导航器时就是这种情况?)

我想要的理由是什么:

  • 在主小部件的每一行中,用户可以与子菜单交互,例如,第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中

如果这是不可能的,我现在想要实现我想要的东西是什么样的: - )

2 个答案:

答案 0 :(得分:0)

你需要让一些父母了解这种子导航。您无法真正替换视图本身,它的父级是树中对该窗口小部件的引用,因此父级需要传达此信息才能使其颤动。

也就是说,您可以制作一个自定义小部件,其工作是监听子事件,并相应地更改子级。

  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"),
    );
  }
}

答案 1 :(得分:0)

我对Flutter还是很陌生,但是我可以想到的一种解决方法是-您将State与小部件一起使用。例如,如果要根据用途显示两行,则可以将所需行的高度设置为1,将第二行的高度设置为零。并按需交换。 当然,您还需要清空内容。例如将文字设置为“等” 这可能不是理想的解决方案,但可以使用。