Layout 颤振:有可能替换小部件本身吗? 我有以下情况: 行为1,2,3的主窗口小部件 在第2行中,我首先将小部件设置为 我想要的是: 一旦小部件A中的状态发生变化,就用小部件B替换小部件A 在小部件A中而不是在主小部件中处理替换(因此我不想使用来自小部件A的回调或观察全局状态并在主小部件中对其作出反应) 替换意味着:小部件B仍然是主小部件的子部件(在我的情况下,它停留在第二行,不会全屏显示,因为您使用routes/Navigator时是这样的?) 我想要什么的理由: 在主窗口小部件的每一行中,用户可以与子菜单交互,例如,在第2行中,子菜单由WidgetA->[user interaction]->WidgetB[user interaction]->WidgetC组成 我不想从主窗口小部件管理所有这些不同的状态 我尝试的是:

Layout 颤振:有可能替换小部件本身吗? 我有以下情况: 行为1,2,3的主窗口小部件 在第2行中,我首先将小部件设置为 我想要的是: 一旦小部件A中的状态发生变化,就用小部件B替换小部件A 在小部件A中而不是在主小部件中处理替换(因此我不想使用来自小部件A的回调或观察全局状态并在主小部件中对其作出反应) 替换意味着:小部件B仍然是主小部件的子部件(在我的情况下,它停留在第二行,不会全屏显示,因为您使用routes/Navigator时是这样的?) 我想要什么的理由: 在主窗口小部件的每一行中,用户可以与子菜单交互,例如,在第2行中,子菜单由WidgetA->[user interaction]->WidgetB[user interaction]->WidgetC组成 我不想从主窗口小部件管理所有这些不同的状态 我尝试的是:,layout,widget,dart,flutter,navigator,Layout,Widget,Dart,Flutter,Navigator,这不起作用,因为小部件B不停留在主小部件的WidgetTree中 如果这是不可能的,我想知道实现我想要的东西的方法是什么:-)你需要有一些知道这种亚导航的父母。您不能真正地单独替换视图,它的父级是树中对该小部件的引用,因此父级是需要将其传递给flifter的 也就是说,您可以创建一个自定义小部件,其任务是侦听子事件,并相应地更改子事件 App / \ Row Row | WidgetParent | WidgetA 在这里,widgetpresen

这不起作用,因为小部件B不停留在主小部件的WidgetTree中


如果这是不可能的,我想知道实现我想要的东西的方法是什么:-)

你需要有一些知道这种亚导航的父母。您不能真正地单独替换视图,它的父级是树中对该小部件的引用,因此父级是需要将其传递给flifter的

也就是说,您可以创建一个自定义小部件,其任务是侦听子事件,并相应地更改子事件

  App
 /   \
Row  Row
      |
 WidgetParent
      | 
   WidgetA
在这里,
widgetpresent
可以保持例如a
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));
  }
}
类WidgetParent扩展AnimatedWidget{ WidgetParent():super(可列出:ValueNotifier(null)); ValueNotifier get notifier=>listenable as ValueNotifier; 小部件构建(构建上下文){ 返回新中心(子项: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"),
    );
  }
}
类WidgetA扩展了无状态小部件{
WidgetA(this.notifier);
最终估价通知人通知人;
@凌驾
小部件构建(构建上下文){
返回上升按钮(
onPressed:()=>notifier.value=WidgetB(通知程序),
孩子:文本(“这是A,转到B”),
);
}
}
类WidgetB扩展了无状态小部件{
WidgetB(this.notifier);
最终估价通知人通知人;
@凌驾
小部件构建(构建上下文){
返回上升按钮(
onPressed:()=>notifier.value=WidgetA(通知程序),
孩子:文本(“这是B,去A”),
);
}
}

我对Flutter还不太熟悉,但我认为有一个解决办法——在小部件中使用状态。例如,如果希望根据用途显示两行,则可以将一行的高度设置为所需的高度,并将第二行的高度设置为零。按需交换。 当然,您也需要清空内容。e、 g.将文本设置为“”等。
这可能不是理想的解决方案,但可能有效。

我不明白。你有一个真实世界的例子或图画吗?听起来你想要一个有条件的小部件?类似于
(showB==true)的内容?WidgetB():WidgetA()我相当确定,在任何情况下,您都必须将某些内容传递回主小部件。
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"),
    );
  }
}