flutter - 在 initState 中请求 TextField 焦点

标签 flutter dart

我有一个带有 UID 和 PWD TextField 的登录页面。 UID 一旦提供就会存储在共享首选项中。因此,每当显示登录屏幕时,焦点可能位于 UID 文本字段(如果未提供/存储 UID)或 PWD 文本字段(如果显示或提供并自动填充 UID)。

我遇到的问题是我试图使用以下方法将焦点设置到正确的 TextField:

FocusScope.of(context).requestFocus(_uidFocusNode)
FocusScope.of(context).requestFocus(_pwdFocusNode);

其中 _uidFocusNode 和 _pwdFocusNode 定义为 FocusNode,并通过 focusNode 属性附加到适当的 TextField。

现在,我无法在 initState 中使用上述语句设置焦点,因为 Widget 尚未构建。但是当我在构建方法中设置它时,它会导致重建并且焦点字段一直在闪烁。有没有办法在构建 Widget 时根据逻辑设置焦点?请注意,自动对焦无法按预期工作 - 我需要将光标置于字段中。

最佳答案

当然!您可以使用 SchedulerBinding.addPostFrameCallback 安排在构建完成后调用的函数。 .
您可以简单地在 initState 中使用它:

@override
void initState() {
  super.initState();

  SchedulerBinding.instance.addPostFrameCallback((Duration _) {
    FocusScope.of(context).requestFocus(condition ? _pwdFocusNode : _uidFocusNode);
  });
}

确保在文件开头添加 import 'package:flutter/scheduler.dart';

关于flutter - 在 initState 中请求 TextField 焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58719769/

相关文章:

flutter - 跟踪我的全局dart变量的最佳方法(可以重新分配和读取)

multithreading - 应用程序退出时正在运行的线程是否被杀死?

flutter - flutter scrollView无法在Stream中滚动

firebase - 如何在 Flutter 中使用 Firestore withConverter

dart - Flutter 检查应用程序是否在 iPad 或 iPhone 上运行

Flutter 异常 `setState() or markNeedsBuild() called during build` 通过在 NotificationListener 回调中调用 setState

dart - 权限被拒绝使用 video_player 的文件构造函数

flutter - 更新 Flutter 后 StaggeredGridView 不滚动

Dart:列表删除不删除对象

dart - 使用 RootContext 带有参数的 @NgCallback