gpt4 book ai didi

flutter - 在 Navigator.push 之后聚焦到目标页面的 textfield 时会再次调用 Navigator.push

转载 作者:IT王子 更新时间:2023-10-29 07:04:20 25 4
gpt4 key购买 nike

出现以下现象。

  1. 通过 Navigation.pushFirstPage 过渡到 NextPage
  2. 选择 NextPageTextField
  3. 1 再次被调用。
  4. 使用键盘完成。
  5. 1 再次被调用。

下面是来源。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: FirstPage(),
);
}
}

class FirstPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("sample"),
),
body: RaisedButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) {
print("Before call NextPage()");
return NextPage();
}),
);
},
child: Text("next page"),
),
);
}
}

class NextPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("next page"),
),
body: TextField(),
);
}
}

下面是动画 gif,其中在点击 TextField 和 DONE 键盘时打印日志。

enter image description here

为什么会这样? (错误?)
我该如何解决?

最佳答案

如您所见,即使多次调用该日志,您也只会在第一次调用时看到一个转换,或者换句话说,您获得了预期的效果。这是有原因的。让我们分解一下:

在Flutter中,builders可以被多次调用,原因多种多样,应该是幂等的(不影响逻辑业务);

也就是说,当您导航到第二个屏幕时,您正在构建一个 TextFormField,它是 Stateless Widget` 的子项,它应该是不可变的。这意味着它的最终值(如果需要)应该在构造函数中传递,并且每次状态更改时(例如字段的默认文本)都将需要更改,从而通过触发构建器重建 View ;

因此,例如,如果您改用 Stateful Widget,那么您的构建器可能不会被调用,而只会调用其 build 方法>状态

您可以在类似的已关闭问题中找到关于此的讨论 here

关于flutter - 在 Navigator.push 之后聚焦到目标页面的 textfield 时会再次调用 Navigator.push,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54802181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com