【问题标题】:How to programmatically make keyboard textfield open如何以编程方式打开键盘文本字段
【发布时间】:2020-07-14 12:33:03
【问题描述】:

您好,我想知道是否可以在 Flutter 中以编程方式打开键盘以及立即准备好光标和文本字段。

我已经知道如何拉起键盘了 FocusScope.of(context).requestFocus(FocusNode());

但我还需要知道如何让文本字段准备好输入,而无需用户点击文本字段。 如

假设我有一个文本字段:

TextField(
  controller: textEditingController,
);

我想使用下面的代码,这样用户就不必点击文本字段

textEditingController.openTextField()//Pseudo code

: 编辑 ------------------------------------------------

我有点糟糕,但我忘了在文本字段中添加焦点节点作为参数

在你的班级内添加

最终的 FocusNode _focusNode = FocusNode();

然后添加到文本字段

TextField(
  ...
  focusNode:_focusNode,
  ...
);

然后通过运行调用它

_focusNode.requestFocus();

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    首先,您需要定义 FocusNode 变量并将其分配给您的 TextField,如下所示:

    //in header class
    FocusNode focusNode  = FocusNode ();
    
    //in build method
    TextField(focusNode: focusNode,)
    

    然后使用这个代码:

    FocusScope.of(context).requestFocus(focusNode);
    

    【讨论】:

    • 您好,我想知道您是否可以查看我对帖子的编辑,看看我的解释是否更清楚。我的目标是让用户不必点击文本字段然后输入文本。
    • 您可以在需要的地方使用此代码,例如在计时器之后或打开页面时等。
    • 但即使键盘已启动输入文本,用户仍需点击文本字段
    【解决方案2】:

    下面的完整代码,此代码使TextField 聚焦并打开键盘

    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    
    void main() => runApp(App());
    
    class App extends StatelessWidget {
      @override
      Widget build(BuildContext context) => MaterialApp(home: HomeScreen());
    }
    
    class HomeScreen extends StatefulWidget {
      @override
      _HomeScreenState createState() => _HomeScreenState();
    }
    
    class _HomeScreenState extends State<HomeScreen> {
    
      final TextEditingController _controller = TextEditingController();
      final FocusNode _focusNode = FocusNode();
    
      @override
      void initState() {
        super.initState();
        WidgetsBinding.instance.addPostFrameCallback((_) {
          _focusNode.requestFocus();
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: TextField(
            focusNode: _focusNode,
            controller: _controller,
          ),
        );
      }
    
      @override
      void dispose() {
        _focusNode.dispose();
        _controller.dispose();
        super.dispose();
      }
    }
    

    【讨论】:

    • 你能不能缩短你的答案,让它基本上说记住将焦点节点添加到你的文本字段参数中,这样它就没有完整的工作示例
    【解决方案3】:

    StatefulWidget 会来救援。 WidgetsBinding 具有 addPostFrameCallback() 方法,一旦 Widget Build() 被执行,该方法将被调用。所以在initState() 里面我们可以用它变魔术

    使用 nextFocus:

     @override
      void initState() {
        super.initState();
        WidgetsBinding.instance.addPostFrameCallback((_) {
          FocusScope.of(context).nextFocus();
        });
      }
    

    文本字段代码:

    Scaffold(
            appBar: AppBar(),
            body: TextField(),
          ),
    

    使用 FocusNode :

     FocusNode focusNode = FocusNode();
    
      @override
      void initState() {
        super.initState();
        WidgetsBinding.instance.addPostFrameCallback((_) {
          FocusScope.of(context).requestFocus(focusNode);
        });
      }  
    

    用途:

    Scaffold(
            appBar: AppBar(),
            body: TextField(
              focusNode: focusNode,
            ),
          ),
    

    输出:

    【讨论】:

      猜你喜欢
      • 2014-10-04
      • 2021-11-28
      • 2016-09-07
      • 1970-01-01
      • 2021-06-19
      • 2017-01-29
      • 2016-06-05
      • 1970-01-01
      • 2019-09-18
      相关资源
      最近更新 更多