Я столкнулся с очень странной ошибкой Flutter, которая может быть у кого-то есть.
Flutter в настоящее время не имеет отличного способа автоматического перехода из TextField в Textfield в форме.Рекомендуемое решение состоит в том, чтобы создать FocusNode для каждого текстового поля, а затем, когда пользователь заканчивает редактирование, программно выбрать следующий FocusNode.
Кажется, что работает нормально, однако это также вызывает некоторые очень странные визуальные сбои, если ваша формане на первом маршруте в приложении (что чаще всего не так)
На втором маршруте, как только вы нажмете TextField, украшение на мгновение мигнет, а затем исчезнет, однако курсор останется,Вы можете продолжать выбирать TextFields, и в итоге вы получите курсор на каждом поле.Поле по-прежнему функционирует правильно, поэтому это чисто визуальный сбой.
TextField с несколькими курсорами
Кажется, проблема тесно связана с навигатором.Если вы создаете экран на первом маршруте с пользовательскими узлами FocusNode, он работает нормально.И наоборот, если вы не используете FocusNodes на втором экране, это тоже хорошо.Только когда вы комбинируете оба из них, возникает проблема.
Вот простое приложение, которое демонстрирует эту проблему.
import 'package:flutter/material.dart';
void main() {
runApp(TestApp());
}
class TestApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark(),
home: TestScreen(),
);
}
}
class TestScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: Center(
child: RaisedButton(
onPressed: () => _pushSecondScreen(context),
child: Text('Push to a new screen')
),
),
)
);
}
void _pushSecondScreen(BuildContext context) {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => SecondTest()));
}
}
class SecondTest extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Second Screen'),
),
body: ListView(
padding: EdgeInsets.all(20.0),
children: List<Widget>.generate(10, (i) => _buildTextField(i)),
),
);
}
Widget _buildTextField(int index) {
// The custom focus node is thrown in here for example, but in a real world app,
// a reference to the node would be kept so the app can manage focus between the nodes
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: TextField(
focusNode: FocusNode(),
decoration: InputDecoration(
labelText: 'Field $index',
filled: true,
border: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(5.0))
)
),
),
);
}
}
Я разместил код, чтобы дублировать эту проблему в этой сущности:https://gist.github.com/bkayfitz-cara/8da2afd964c7f4417435e9df49b4cd9e