Перестройка виджета после выбора TextField Flutter - PullRequest
0 голосов
/ 11 мая 2018

Я разрабатываю приложение Flutter, которое должно было иметь форму.Поэтому, когда пользователь открывает приложение, перед формой появляется экран-заставка со следующим кодом:

import 'package:flutter/material.dart';
import '../model/User.dart';
import './FileManager.dart';
import './MyListPage.dart';

class UserLoader extends StatefulWidget {
  @override
  _UserLoaderState createState() => new _UserLoaderState();
}

class _UserLoaderState extends State<UserLoader> {
  final userFileName = "user_infos.txt";
  User _user;

  @override
  Widget build(BuildContext context) {
    print("build UserLoader");
    final _formKey = new GlobalKey<FormState>();
    final _firstNameController = new TextEditingController();
    final _lastNameController = new TextEditingController();
    final _emailController = new TextEditingController();
    final _phoneController = new TextEditingController();

    return new Scaffold(
        appBar: new AppBar(
          title: new Text("Informations"),
          actions: <Widget>[
            new IconButton(
                icon: const Icon(Icons.save),
                onPressed: () {
                  _user = _onFormValidate(
                      _formKey.currentState,
                      _firstNameController.text,
                      _lastNameController.text,
                      _emailController.text,
                      _phoneController.text);
                })
          ],
        ),
        body: new Center(
          child: new SingleChildScrollView(
              child: new Form(
                  key: _formKey,
                  child: new Column(children: <Widget>[
                    new ListTile(
                      leading: const Icon(Icons.person),
                      title: new TextFormField(
                        decoration: new InputDecoration(
                          hintText: "Prénom",
                        ),
                        keyboardType: TextInputType.text,
                        controller: _firstNameController,
                        validator: _validateName,
                      ),
                    ),
                    new ListTile(
                      leading: const Icon(Icons.person),
                      title: new TextFormField(
                        decoration: new InputDecoration(
                          hintText: "Nom",
                        ),
                        keyboardType: TextInputType.text,
                        controller: _lastNameController,
                        validator: _validateName,
                      ),
                    ),
Etc, etc ...

Однако, когда я нажимаю на TextField, клавиатура сразу же появляется и закрывается, и весь компонент перестраивается.Поэтому я не могу заполнить форму ..

Может кто-нибудь найти решение, пожалуйста?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

вам просто нужно создать новый класс и импортировать его в целевой класс, в котором обнаружена проблема.например:

Я обычно создаю такой класс:

class MiddleWare
{
  static MiddleWare shared = MiddleWare();
  _MiddleWare(){}
  String myText = "my Text";
  // every variables should be here...
}

и

import "MiddleWare.dart";

class myclass extends StatefulWidget {
  @override
  _myclassState createState() => _myclassState();
}

class _myclassState extends State<myclass> {
  @override
  Widget build(BuildContext context) {
    return Container(child: Text(MiddleWare.shared.myText));
  }
}

вот и все.

0 голосов
/ 29 мая 2018

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

Одна ловушка, в которую я сам попал (и, возможно, влияет на вас, когда я собираюсь изваше описание) имеет виджет с отслеживанием состояния, вложенный в другой виджет с сохранением состояния.

Например,

class Parent extends StatefulWidget {
  @override
  ParentState createState() => ParentState();

  (...)
}

class ParentState extends State<Parent> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Child(),
    );
  }

  (...)
}

class Child extends StatefulWidget {
  @override
  ChildState createState() => ChildState();

  (...)
}

class ChildState extends State<Child> {
  @override
  Widget build(BuildContext context) {
    return TextField(...);
  }

  (...)
}

Проблема в том, что перестройка Parent означает, что ParentState().build() запущен, иСоздается новый Child экземпляр с новым объектом ChildState.Что сбрасывает все.

Попытайтесь не воссоздавать ChildWidget, а вместо этого сохранить его в ParentState, например так:

class Parent extends StatefulWidget {
  @override
  ParentState createState() => ParentState();

  (...)
}

class ParentState extends State<Parent> {
  Child _child;

  @override
  void initState() {
    _child = Child();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: child,
    );
  }

  (...)
}
// The rest remains the same

Редактировать: вам просто нужно помнить это, если ваше дерево виджетов немногоболее сложным, вам может понадобиться 1) передать обратный вызов от Родителя, чтобы уведомить об изменениях состояния, и 2) не забыть также вызвать setState () для Дочернего объекта.

...