暂时禁用文本字段时,请保持键盘处于打开状态 [英] Keep keyboard open when temporarily disabling text field

查看:61
本文介绍了暂时禁用文本字段时,请保持键盘处于打开状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在暂时禁用文本字段的同时保持键盘在屏幕上?

How to keep the keyboard on screen while temporarily disabling a text field?

CupertinoTextFieldenabled=falsereadOnly=true时关闭键盘.我需要将键盘保持在屏幕上.

CupertinoTextField dismisses the keyboard when enabled=false or readOnly=true. I need to keep the keyboard on screen.

推荐答案

我搜索了大约四个小时,最后想出了一个解决方案:让文本字段的onChanged函数集中一个接受键盘输入的隐藏小部件.处理完成后,再次聚焦文本字段.

I searched for about four hours and finally came up with a solution: Have the text field's onChanged function focus a hidden widget that accepts keyboard input. Once the processing is complete, focus the text field again.

工作示例:

import 'package:flutter/cupertino.dart'
    show
        CupertinoApp,
        CupertinoButton,
        CupertinoPageScaffold,
        CupertinoTextField;
import 'package:flutter/widgets.dart'
    show
        BuildContext,
        Center,
        ClipRect,
        Column,
        Container,
        FocusNode,
        FocusScope,
        MainAxisSize,
        runApp,
        State,
        StatefulWidget,
        Text,
        TextAlign,
        TextEditingController,
        Widget;
import 'package:meta/meta.dart' show required;

class KeepKeyboardOnScreen extends StatefulWidget {
  final FocusNode focusNode;

  const KeepKeyboardOnScreen({@required this.focusNode});

  @override
  State createState() => KeepKeyboardOnScreenState();
}

class KeepKeyboardOnScreenState extends State<KeepKeyboardOnScreen> {
  TextEditingController _controller;

  @override
  void initState() {
    super.initState();
    _controller = new TextEditingController();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) => Container(
        height: 0,
        child: ClipRect(
          child: CupertinoTextField(
            controller: _controller,
            focusNode: widget.focusNode,
            onChanged: (_) => _controller.clear(),
          ),
        ),
      );
}

class Page extends StatefulWidget {
  @override
  State createState() => PageState();
}

class PageState extends State<Page> {
  TextEditingController _controller;
  FocusNode _focusNode;
  FocusNode _keepKeyboardOnScreenFocusNode;
  bool enabled = true;

  @override
  void initState() {
    super.initState();
    _controller = new TextEditingController();
    _focusNode = new FocusNode();
    _keepKeyboardOnScreenFocusNode = new FocusNode();
  }

  @override
  void dispose() {
    _controller.dispose();
    _focusNode.dispose();
    _keepKeyboardOnScreenFocusNode.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) => CupertinoApp(
        home: CupertinoPageScaffold(
          child: Center(
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                CupertinoTextField(
                  controller: _controller,
                  focusNode: _focusNode,
                  enabled: enabled,
                ),
                KeepKeyboardOnScreen(focusNode: _keepKeyboardOnScreenFocusNode),
                CupertinoButton(
                    onPressed: () {
                      setState(() {
                        enabled = true;
                      });
                      FocusScope.of(context).requestFocus(_focusNode);
                    },
                    child: Text("Enable", textAlign: TextAlign.center)),
                CupertinoButton(
                    onPressed: () {
                      setState(() {
                        enabled = false;
                      });
                      FocusScope.of(context)
                          .requestFocus(_keepKeyboardOnScreenFocusNode);
                    },
                    child: Text("Disable", textAlign: TextAlign.center)),
              ],
            ),
          ),
        ),
      );
}

void main() async {
  runApp(Page());
}

另请参阅: Flutter问题#45076添加有关管理键盘焦点的高级文档和示例.

这篇关于暂时禁用文本字段时,请保持键盘处于打开状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆