Восстановление виджета флаттера при щелчке виджета TextField - PullRequest
1 голос
/ 02 апреля 2019

Я уверен, что это ошибка новичка, но я не могу понять это.В приведенном ниже приложении при нажатии на текстовое поле на втором маршруте клавиатура открывается и сразу закрывается.При ближайшем рассмотрении кажется, что виджет перестраивается всякий раз, когда он фокусируется, вызывая сброс маршрута, и пользователь не может вводить текст.

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

Есть идеи?

import 'package:flutter/material.dart';


void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My app',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.lightBlue,
        fontFamily: 'Nunito',
      ),
      home: LoginPage(),
    );
  }
}


class LoginPage extends StatefulWidget {

  @override
  LoginPageState createState() {
    return new LoginPageState();
  }
}

class LoginPageState extends State<LoginPage> {

  Widget build(BuildContext context) {

    final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();

    final registerButton = Padding(
      padding: EdgeInsets.symmetric(vertical: 16.0),
      child: RaisedButton(
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(24),
        ),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => SecondPage()),
          );
        },
        child: Text('Register Now', style: TextStyle(color: Colors.white)),
      ),
    );

    // Now load the main login page
    return Scaffold(
      backgroundColor: Colors.white,
      key: _scaffoldKey,
      body: Center(
        child: ListView(
          shrinkWrap: true,
          children: <Widget>[
            registerButton,
          ],
        ),
      ),
    );
  }
}


class SecondPage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {

    final emailController =  TextEditingController();
    final _formKey = GlobalKey<FormState>();

    final email = TextFormField(
      keyboardType: TextInputType.emailAddress,
      controller: emailController,
      autofocus: false,
      decoration: InputDecoration(
        hintText: 'Email',
        contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
        border: OutlineInputBorder(borderRadius: BorderRadius.circular(32.0)),
      ),
    );

    return Scaffold(
      appBar: AppBar(
        title: Text('Second page'),
      ),
      body: Center(
        child: Form(
          key: _formKey,
          child: email,
        ),
      ),
    );
  }
}

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Когда вы нажимаете TextField, Flutter повторно объявляет ваш _formKey.Так что это повод перестроить ваш виджет.Вам нужно объявить _formKey вне метода build, чтобы Flutter не переименовал вашу переменную.

0 голосов
/ 02 апреля 2019

вы должны объявить _formKey как статические вне метода сборки.

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