Flutter InheritedWidget更新导致问题

Flutter InheritedWidget更新导致问题,flutter,Flutter,每当设置新位置时,我都会使用应用程序顶部的继承小部件更新应用程序。这将刷新我应用程序中每个可能位置的位置坐标 然而,我也有一个文本字段。几秒钟后,当我点击文本字段时 键盘将被继承小部件的更新隐藏。 有没有办法防止flatter隐藏键盘或重新初始化状态,以便继承小部件的更新与我的搜索字段一起工作? 当我输入一些文本时,也可能会触发继承的小部件进行新的更新,但搜索栏和键盘应该保持打开状态。 new TextField( controller: _controller,

每当设置新位置时,我都会使用应用程序顶部的继承小部件更新应用程序。这将刷新我应用程序中每个可能位置的位置坐标

然而,我也有一个文本字段。几秒钟后,当我点击文本字段时 键盘将被继承小部件的更新隐藏。 有没有办法防止flatter隐藏键盘或重新初始化状态,以便继承小部件的更新与我的搜索字段一起工作? 当我输入一些文本时,也可能会触发继承的小部件进行新的更新,但搜索栏和键盘应该保持打开状态。

 new TextField(
          controller: _controller,
          autocorrect: false,
          autofocus: true
          ...
)

如果看不到所有代码,就有点难知道发生了什么

不过,我最好的猜测是,您正在使用文本字段上方的某个上下文来注册继承的小部件的更新

但是我建议你做的是从你的文本字段进入小部件树,确保你没有在上面的上下文中使用继承的小部件。在构建方法的开始处放置一些调试语句,以确定从何处触发构建,这可能是值得的(如果正确使用继承的小部件,则不应立即在其下方触发重建,但发生了一些奇怪的事情)

这包括,如果您有以下内容:

MyWidget extends StatelessWidget {
  Widget build(BuildContext context) {
    Location location = MyInheritedWidget.of(context).location;
    return new Row(
      children: [
        new LocationDisplayer(location),
        new TextField( ..... ),
      ],
    );
  }    
}
MyWidget extends StatelessWidget {
  Widget build(BuildContext context) {
    return new Row(
      children: [
        new Builder(
          builder: (context) {
            Location location = MyInheritedWidget.of(context).location;
            return new LocationDisplayer(location);
          },
        ),
        new TextField( ..... ),
      ],
    );
  }    
}
我之所以这么说,是因为我对继承小部件如何工作的理解;当它发生变化时,使用其上下文获取继承的小部件的任何小部件都会被重建

这意味着,即使你的文本字段在技术上没有改变任何属性,它实际上可能是一个新的文本字段,这取决于构建过程(有一点颤振魔法,我不完全理解他们是如何决定何时进行新的vs重新构建的),因此它没有要求关注

不必编写一堆新的小部件来封装使用MyInheritedWidget的任何东西,我相信您可以使用如下内容:

MyWidget extends StatelessWidget {
  Widget build(BuildContext context) {
    Location location = MyInheritedWidget.of(context).location;
    return new Row(
      children: [
        new LocationDisplayer(location),
        new TextField( ..... ),
      ],
    );
  }    
}
MyWidget extends StatelessWidget {
  Widget build(BuildContext context) {
    return new Row(
      children: [
        new Builder(
          builder: (context) {
            Location location = MyInheritedWidget.of(context).location;
            return new LocationDisplayer(location);
          },
        ),
        new TextField( ..... ),
      ],
    );
  }    
}

如果你100%确定你在任何地方都没有这样做,那么你可以选择不受干扰的方式来做事情。。。location类可以公开subscribe和unsubscribe方法。您实际使用位置调用subscribe(也应该是有状态的小部件)的所有小部件,在它们的
initState()
中有回调,在它们的
dispose()
中取消订阅。location类将只调用每个回调,而不是像现在这样更改状态,并且在每个回调中,您应该为实际显示位置的小部件调用
setState

当前我使用上下文调用它。inheritFromWidgetOfExactType(MyInheritedWidget);在建筑工地。但这不起作用。我认为这会导致一切重建?因为继承的小部件嵌套在my appOh的根中。Flatter文档通常建议添加一个静态方法
MyInheritedWidget.of(Context)
,该方法调用
Context.inheritFromWidgetOfExactType(…)
,并具有合理的回退/检查等功能(参见,但我的回答适用于即使您只是直接调用上下文-您必须小心调用哪个小部件的上下文。其思想是,InheritedWidget中的嵌套小部件在发生更改时不会自动重建,因此这不应该是问题所在。您要么必须对此进行检查,要么提供对某些源的访问,或者创建一个可以运行以显示问题的小型自包含示例-否则我就帮不了什么忙了。看起来继承的小部件太复杂了,因为它破坏了所有状态条件,我无法让它工作。在dart/Flatter中是否有一个register/remove listener类可以轻松使用?你知道有没有这样的事吗?register方法看起来像register(VoidCallback),回调是在新的更新到来时执行的,对吗?