Flutter TextFormFields очищается при закрытии клавиатуры - PullRequest
0 голосов
/ 25 мая 2020

Примерно то, что я описываю в названии. У меня есть куча TextFormFields, заполняемых из Firebase при запуске приложения.

Пользователь должен иметь возможность обновлять их, и когда они будут выполнены, нажмите кнопку отправки, чтобы обновить базу данных. Весь код базы данных работает, однако есть некоторая ошибка, которая работает следующим образом:

TextFormField1:   "New Text Entered"
TextFormField2:   "Some more text"
TextFormField3:   "Another update here"

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

Кто-нибудь это видел?

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

Пожалуйста, скажите мне, что Flutter не делает чего-то принципиально глупого, вроде перезагрузки находящегося под ним виджета с нуля каждый раз, когда вы go просите клавиатуру удалиться… Похоже, что это так.

1 Ответ

1 голос
/ 25 мая 2020

Да. Со мной такое случается постоянно. Это связано с тем, что экран перестраивается при изменении нижних вставок (из-за клавиатуры).

  1. Вложите TextFormField(s) в Form и дайте ему глобальный ключ.
  2. Используйте локальная переменная для хранения значения TextFormField. Обновите его в методе onChanged. Готово!

Для простоты приложу код

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: LoginScreen(),
    );
  }
}

// Login Screen
class LoginScreen extends StatefulWidget {
  @override
  _LoginScreenState createState() => _LoginScreenState();
  static GlobalKey<FormState> _loginScreenFormKey = GlobalKey<FormState>();
}

class _LoginScreenState extends State<LoginScreen> {
  String username;
  String password;

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: Form(
          key: LoginScreen._loginScreenFormKey,
          child: Column(
            children: [
              TextFormField(
                decoration: InputDecoration(
                  hintText: 'Enter username',
                ),
                onChanged: (value) {
                  setState(() {
                    username = value;
                  });
                },
              ),
              TextFormField(
                decoration: InputDecoration(
                  hintText: 'Enter username',
                ),
                onChanged: (value) {
                  setState(() {
                    password = value;
                  });
                },
                obscureText: true,
              ),
              RaisedButton(
                onPressed: () {
                  LoginScreen._loginScreenFormKey.currentState.save();
                },
                child: Text('submit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...