请求initState中的TextField焦点

时间:2019-11-05 21:31:58

标签: flutter dart

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

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

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

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

现在,由于尚未构建Widget,因此无法在initState中使用以上语句设置焦点。但是,当我在build方法中设置它时,它会导致重新生成,并且具有焦点的字段一直闪烁。在构建小部件时,有没有一种方法可以根据逻辑设置焦点?请注意,自动对焦无法按预期工作-我需要将光标置于字段中。

1 个答案:

答案 0 :(得分:0)

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

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

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

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