我在Stable分支中使用Flutter 1.2.1,为了说明我的问题,假设我有页面A和B,A使用Navigator.push
导航到B,B使用Navigator.pop
导航回A,两者都是有状态的小部件。
当我从A导航到B,然后弹回到A时,一切正常,A保持其状态。但是,如果我从A导航到B,点击B中的一个文本字段打开键盘,然后关闭键盘并弹回到A,A的整个状态将被刷新,并再次调用A的initState()
方法。我使用print语句验证了这一点。
只有当我在弹回A之前打开键盘时才会发生这种情况。如果我导航到B,然后立即导航回A,而不与任何东西交互,那么A将保持其状态,不会重新初始化。
据我所知,build方法一直被调用,但是initState()
不应该像这样被调用。有人知道这是怎么回事吗?
5条答案
按热度按时间ruoxqz4g1#
经过反复试验,我确定了问题所在。我忘记了我已经在
MaterialApp
小部件中为/
路由设置了FutureBuilder
。我传递了一个函数调用,该函数调用返回一个future到FutureBuilder
构造函数的future
参数,而不是指向future的变量。因此,每次更新路径时,都会创建一个全新的future,在
MaterialApp
构造函数之外进行函数调用,并将得到的future存储在一个变量中,然后将其传递给FutureBuilder
,这样就完成了任务。看起来这和我在键盘打开时的奇怪行为没有关系,但这绝对是原因,请看下面的内容。
存在错误的代码:
固定代码:
gudnpqoy2#
您是否在“A”小工具中使用了AutomaticKeepAliveClientMixin?如果您没有,请查看此https://stackoverflow.com/a/51738269/3542938如果您已经使用它,请给予我们一个代码,我们可以直接在“main.dart”中测试它以帮助您
aiqt4smr3#
是的,发生在我身上,也许把FutureBuilder Package 成一个PageWidget,并使它成为一个单件会更好
6qfn3psc4#
我得到了一个解决方案,我在超类的构造函数中初始化变量。我删除了它并开始工作!
b09cbbtk5#
我刚刚从MaterialApp的主目录中删除了FutureBuilder,并将MyApp更改为一个有状态小部件,在initState中获取了必要的信息,并在**. then()中调用了setState;* *,而不是在MaterialApp的主目录中传递多个条件,我将这些条件移动到一个单独的有状态小部件中,问题得到了解决。
如果您需要更多的信息,请留下评论。