Не удается сфокусироваться на TextField на новой странице после навигации по флаттеру
По какой-то причине я не могу сосредоточиться на TextField после на следующей странице после навигации. Клавиатура будет автоматически отклоняться при выборе TextField. Если я установлю autofocus: true
на TextField, клавиатура будет бесконечно всплывать и сразу же исчезать снова и снова.
Я столкнулся с этим, когда мое приложение было разумного размера, но я смог воссоздать это в минимальном примере приложения.
Я использую Dart 2.0.0-dev.55.0 с бета-версией Flutter v0.3.2.
Код для главной страницы:
import 'package:flutter/material.dart';
import 'settings.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Helpful text.',),
// ===== Where navigation happens =====
RaisedButton(
onPressed: () {
Navigator.push(context, PageRouteBuilder(
pageBuilder: (_, __, ___) => SettingsPage()));
},
child: Text('Go to input page'),
),
],
),
),
);
}
}
Вот код для страницы с TextField.
import 'package:flutter/material.dart';
class SettingsPage extends StatefulWidget {
SettingsPage({Key key}) :
super(key: key);
@override
_SettingsPage createState() => new _SettingsPage();
}
class _SettingsPage extends State<SettingsPage> {
@override
Widget build(BuildContext context) {
final key = GlobalKey<ScaffoldState>();
return Scaffold(
key: key,
backgroundColor: Colors.white,
appBar: AppBar(
title: Text("Settings"),
),
body: ListView(
children: <Widget>[
Text("Enter something"),
// Can't focus on this widget
TextField(),
],
),
);
}
}
Я могу сосредоточиться на TextField на главной странице, если я добавлю туда, но не могу на страницу на странице настроек. Я предполагаю, что это как-то связано с тем, что клавиатура не имеет приоритета над всплывающей страницей? Или что происходит? Как заставить приложение просто сфокусироваться на полях ввода на навигационной странице?
7 ответов
Таким образом, проблема заключается в том, что я поставляю GlobalKey на эшафот. Удаление ключа решает проблему. Не совсем уверен, почему, но проблема в основном объясняется в этой проблеме Github.
Я использовал эту клавишу, чтобы при показе сообщения об ошибке при проверке ввода отображалось всплывающее окно, но теперь я предпочитаю просто отобразить сообщение об ошибке в текстовом виджете.
в моем случае автофокус:true не работает только на симуляторе iOS, но он будет работать на реальном устройстве как для Android, так и для iOS.
Чтобы решить эту проблему, используйте такой код.
// Class private property
static final GlobalKey<FormFieldState<String>> _searchFormKey = GlobalKey<FormFieldState<String>>()
// Inside widget
TextFormField(
key: _searchFormKey, // Use searchFormKey here like this
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: 'Type here...',
)
)
Просто добавь autofocus
в качестве true
, это откроет клавиатуру при переходе на новый экран
TextField(
autofocus: true,
),
Была похожая проблема с глобальным ключом. Просматривал похожий пример в примере редукции архитектуры флаттера.
Использование ключа, как так, исправил это для меня
static final GlobalKey<FormFieldState<String>> _orderFormKey = GlobalKey<FormFieldState<String>>();
Не уверен, в чем ваша проблема, так как я больше не могу ее воспроизвести. Я только что попробовал ваш код в бета-версии Flutter Channel 1.18.0-11.1.pre, и все заработало, как должно, без изменения исходного кода.
Похоже, это скорее ошибка Флаттера.
У меня также была эта проблема с узлом фокуса, добавленным в текстовое поле. Удаление узла фокуса решило мою проблему.