我最近一直在学习Ffltter,遇到了一些奇怪的问题,当我单击TextField时,键盘会显示出来,托管的和所有祖先窗口小部件都会调用build.

我已经读到,当单击TextField时,将调用build方法,然后整个小部件将被重建,但我遇到的情况有些奇怪,因为在第一个打开的小部件上没有调用构建.

方案:

1-打开应用程序.

2-第一个小部件加载并打印在屏幕上:"第一个构建名为",当我点击文本字段时,键盘弹出,控制台上没有打印任何内容.

3-点击"Open Second"(打开第二个),第二个小部件加载并打印在屏幕上: "名为"的第二个构建",当我单击TextField时,键盘弹出并打印:"名为"第二个构建"(在步骤[1]中不打印任何内容!).

4-单击"Open First",第一个小部件再次加载并打印在屏幕上:"First Build Call",当我单击TextField时,键盘弹出并打印:"Second Build Call First Build Call"(在步骤[1]中,同一个小部件没有打印任何内容!).

代码:

void main() {
  runApp(MaterialApp(home: First()));
}

class First extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print('First build called');
    return Scaffold(
      appBar: AppBar(
        title: Text("HI Ramadan"),
      ),
      body: Column(
        children: <Widget>[
          TextField(),
          RaisedButton(onPressed: () {
            Navigator.push(
                context, MaterialPageRoute(builder: (context) => Second()));
          }, child: Text('Open Second'),),
        ],
      ),
    );
  }
}

class Second extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print('Second build called');
    return Scaffold(
      body: Column(
        children: <Widget>[
          TextField(),
          RaisedButton(onPressed: () {
            Navigator.push(context, MaterialPageRoute(builder: (context) => First()));
          }, child: Text('Open First')),
        ],
      ),
    );
  }
}

弗利特doctor :

[√] Flutter (Channel stable, v1.7.8+hotfix.4, on Microsoft Windows [Version 10.0.17134.885], locale en-US)
    • Flutter version 1.7.8+hotfix.4 at C:\flutter
    • Framework revision 20e59316b8 (3 weeks ago), 2019-07-18 20:04:33 -0700
    • Engine revision fee001c93f
    • Dart version 2.4.0

[√] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    • Android SDK at C:\Users\ASUS\AppData\Local\Android\sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-28, build-tools 28.0.3
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)
    • All Android licenses accepted.

[√] Android Studio (version 3.3)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin version 34.0.1
    • Dart plugin version 182.5215
    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)

[√] VS Code (version 1.36.1)
    • VS Code at C:\Users\ASUS\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.2.0

[√] Connected device (1 available)
    • FLA LX1 • 75U7N18410006702 • android-arm64 • Android 9 (API 28)

• No issues found!


问题:

1-为什么会发生这种情况(在不是树的根的每个小部件上称为构建)?

2-当键盘显示或隐藏时,有没有办法强制Flutter 而不是拨打build?因为我有一个表格,当我点击TextField并输入一些东西,然后点击DropDown,DropDown会被显示出来,然后直接隐藏(因为build呼叫了),我需要再点击DropDown一次才能 Select !

推荐答案

First被重建,因为它在导航堆栈中的位置改变了.

至于你的键盘问题,这post解决了它,你只需要对你的代码稍加修改:

更改此设置:

  RaisedButton(
      onPressed: () {
         Navigator.push(context, MaterialPageRoute(builder: (context) => Second()));
      },
      child: Text('Open Second'),
  ),

  RaisedButton(
      onPressed: () {
         Navigator.push(context, MaterialPageRoute(builder: (context) => First()));
      },
      child: Text('Open First'),
  ),

收件人:

  RaisedButton(
      onPressed: () {
          final page = Second();
          Navigator.push(context,MaterialPageRoute(builder: (context) => page ));
      }, 
      child: Text('Open Second'),
  ),

  RaisedButton(
      onPressed: () {
          final page = First();
          Navigator.push(context,MaterialPageRoute(builder: (context) => page ));
      }, 
      child: Text('Open First'),
  ),

Dart相关问答推荐

在异步方法中,有没有更优雅的方式在DART中等待!=NULL?

如何扩展 Dart 套接字 BroadcastStream 缓冲区大小为 1024 字节?

Const 构造函数不适用于 Dart 并显示 id 为 0

如何获取包含在 Dart 包中的assets资源 的文件路径?

停止在缓存中保存 Flutter Web Firebase 托管

Flutter 错误:主体可能正常完成,导致返回null,但返回类型可能是不可为空的类型

在 Dart 的 Cloud Firestore 中添加文档后如何获取文档 ID

Flutter android 生成apk

Flutter 使用拖动和按钮单击扩展 TextField

如何正确启用/禁用 Flutter 的 Button

如何在 ListView 中添加额外的底部间距?

如何计算列表中元素的出现次数

Dart/Flutter判断值是否为整数

如何使用我的 dart 包私有而不在 pub dart lang 上显示?

有没有可能用Flatter摄像头插件播放视频?

如何在Flutter 的http.MultipartRequest请求上上传文件时获取进度事件

Dart-对base64字符串进行编码和解码

如何在imageprovider类型中传递图像资源?

Dart 是否有断点语句?

判断 datetime 变量是今天、明天还是昨天