Flutter 彈出鍵盤認識

Flutter中TextField使用

目的在於想找出鍵盤刪除鍵的回調。因而有了下文:ios

TextField跟蹤發現 在控件返回裏面 有個_requestKeyboard() 這個函數:npm

//源碼實現 
 void _requestKeyboard() {
    _editableTextKey.currentState?.requestKeyboard();
  }
  
//而後調用 requestKeyboard()
 void requestKeyboard() {
    if (_hasFocus)
      _openInputConnection();
    else
        //請求獲取焦點
      FocusScope.of(context).requestFocus(widget.focusNode);
  }
  
複製代碼

也就是 在requestKeyboard()中,若是是有 _hasFocus == true 的時候就彈出鍵盤 ,(也就是獲取到了焦點)。json

// _openInputConnection ()打開軟鍵盤
TextInputConnection _textInputConnection;
bool get _hasInputConnection => _textInputConnection != null && _textInputConnection.attached;

  void _openInputConnection() {
    if (!_hasInputConnection) {
      final TextEditingValue localValue = _value;
      _lastKnownRemoteTextEditingValue = localValue;
      _textInputConnection = TextInput.attach(this,
          TextInputConfiguration(
              inputType: widget.keyboardType,
              obscureText: widget.obscureText,
              autocorrect: widget.autocorrect,
              inputAction: widget.textInputAction ?? (widget.keyboardType == TextInputType.multiline
                  ? TextInputAction.newline
                  : TextInputAction.done
              ),
              textCapitalization: widget.textCapitalization,
          )
      )..setEditingState(localValue);
    }
    _textInputConnection.show();
  }
複製代碼
解析1 使用TextInputConnection 它的類須要實現 TextInputClient方法 而後重寫:
//TextInputClient 抽象類的回調方法
@override
  void performAction(TextInputAction action) {
    // TODO: implement performAction
    //點擊 鍵盤的 如圖1 位置 這個按鈕的點擊回調
    print(" performAction action $action ");
  }

  @override
  void updateEditingValue(TextEditingValue value) {
    // TODO: implement updateEditingValue
    //value文本輸入內容回調  如 例子1 
    print("updateEditingValue value $value ");
  }
複製代碼

圖1 api

avatar
例子1 (鍵盤輸入後回調內容)

TextEditingValue(text: ┤額度├, selection: TextSelection(baseOffset: 2, extentOffset: 2, affinity: TextAffinity.downstream, isDirectional: false), composing: TextRange(start: -1, end: -1))bash

解析2 TextInputConnection 關閉
//判斷 _hasInputConnection 是否爲空 或者是否已經綁定
void _closeInputConnectionIfNeeded() {
    if (_hasInputConnection) {
      _textInputConnection.close();
      _textInputConnection = null;
      _lastKnownRemoteTextEditingValue = null;
    }
  }
複製代碼
解析3 TextInputConnection 賦值 TextEditingValue
// value.toJSON(), 裏面的值返回的是 json 
void setEditingState(TextEditingValue value) {
    assert(attached);
    SystemChannels.textInput.invokeMethod(
      'TextInput.setEditingState',
      value.toJSON(),
    );
  }
//遠程更新數據在須要的時候
void _updateRemoteEditingValueIfNeeded() {
    if (!_hasInputConnection)
      return;
    final TextEditingValue localValue = _value;
    if (localValue == _lastKnownRemoteTextEditingValue)
      return;
    _lastKnownRemoteTextEditingValue = localValue;
    _textInputConnection.setEditingState(localValue);
  }
複製代碼

TextEditingValue .text 就能夠獲取到輸入的值app

解析4 TextInputConnection 中 setEditingState這個函數調用
/// Requests that the text input control change its internal state to match the given state.
  void setEditingState(TextEditingValue value) {
    assert(attached);
    print(" setEditingState ${value.text} ");
    SystemChannels.textInput.invokeMethod(
      'TextInput.setEditingState',
      value.toJSON(),
    );
  }
複製代碼

當控件獲取焦點的時候調用此函數。koa

Future<dynamic> _handleTextInputInvocation(MethodCall methodCall) async {
    print(" _handleTextInputInvocation MethodCall ${methodCall.method} ");
    if (_currentConnection == null)
      return;
    final String method = methodCall.method;
    final List<dynamic> args = methodCall.arguments;
    final int client = args[0];
    // The incoming message was for a different client.
    if (client != _currentConnection._id)
      return;
    switch (method) {
      case 'TextInputClient.updateEditingState':
        _currentConnection._client.updateEditingValue(TextEditingValue.fromJSON(args[1]));
        break;
      case 'TextInputClient.performAction':
        _currentConnection._client.performAction(_toTextInputAction(args[1]));
        break;
      default:
        throw MissingPluginException();
    }
  }
複製代碼

上面函數打印得出 只有兩個 狀態 TextInputClient.updateEditingState 和 TextInputClient.performAction。ssh

TextInputClient.updateEditingState 是獲取焦點和內容改變都要調用async

TextInputClient.performAction 這個是由點擊 如圖1 位置上的按鈕 狀態 才觸發ide

由此得知 沒有關於刪除按鍵的監聽 和回調。

鍵盤的類 在 包 import 'package:flutter/services.dart'; 下須要導入這個才能使用裏面的類

其實我是想找出 刪除鍵 的監聽 看來是沒有了。。。。至少功夫沒有白費!

相關文章
相關標籤/搜索