Как программно открыть текстовое поле клавиатуры - PullRequest
3 голосов
/ 14 июля 2020

Привет, мне было интересно, можно ли во флаттере программно открыть клавиатуру, а также сразу же получить курсор и текстовое поле, готовое к типу.

Я уже знаю, как поднять клавиатуру FocusScope.of(context).requestFocus(FocusNode());

Но мне также нужно знать, как сделать текстовое поле готовым к вводу без того, чтобы пользователям приходилось касаться текстового поля. как в

Допустим, у меня есть текстовое поле:

TextField(
  controller: textEditingController,
);

Я хотел бы использовать код для эффекта ниже, чтобы пользователю не приходилось нажимать на текстовое поле

textEditingController.openTextField()//Pseudo code

: Изменить -----------------------------------

Плохой бит меня, но я забыл добавить узел фокуса в качестве параметра в текстовое поле

Внутри вашего класса добавьте

final FocusNode _focusNode = FocusNode ();

затем добавьте в текстовое поле

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

, затем вызовите его, запустив

_focusNode.requestFocus();

Ответы [ 3 ]

5 голосов
/ 14 июля 2020

Сначала вам нужно определить переменную FocusNode и присвоить ее вашему TextField следующим образом:

//in header class
FocusNode focusNode  = FocusNode ();

//in build method
TextField(focusNode: focusNode,)

Затем используйте этот код:

FocusScope.of(context).requestFocus(focusNode);
1 голос
/ 14 июля 2020

полный код ниже, этот код делает 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();
  }
}
0 голосов
/ 14 июля 2020

StatefulWidget придет на помощь. WidgetsBinding имеет метод addPostFrameCallback(), который будет вызываться после выполнения Widget Build(). поэтому внутри initState() мы можем делать magi c с ним

С 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,
        ),
      ),

Вывод:

введите описание изображения здесь

...