StatefulWidget Страница воссоздает при открытой клавиатуре - PullRequest
0 голосов
/ 25 декабря 2018

На странице моего профиля есть опция редактирования, когда я использую значок "Изменить". Я изменяю текстовый виджет на виджет TextField, используя логическое условие, например
widget.isUpdate ? new Flexible(child: new TextField()) : Text("Text Widget"), оно работает, но когда фокусировка на TextField открыта, клавиатура в это время открыта. StatefulWidget воссоздает так снова Boolean.стало ложным, тогда Textfield переместится в Text Widget.Этот сценарий возможен только в том случае, если страница имеет push-страницу Navigator (Вторая страница), например

 Navigator.push(context,MaterialPageRoute(builder: (context) => UpdateProfile()))

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

Код:

import 'package:flutter/material.dart';

class UpdateProfile extends StatefulWidget {
  bool isUpdate = false;

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return UpdateProfileState();
  }
}

class UpdateProfileState extends State<UpdateProfile> {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
          title: Text("Update"),
          elevation: 2.0),
      body: Container(
        width: double.infinity,
        height: double.infinity,
        color: Colors.red,
        margin: const EdgeInsets.all(10.0),
        child: Row(
          children: <Widget>[
            widget.isUpdate ? new Flexible(child: new TextField()) : Text("Text Widget"),
            GestureDetector(
              child: IconTheme(
                  data: IconThemeData(color: Color(0xFFffffff)),
                  child: Icon(Icons.edit)),
              onTap: () {
                setState(() {
                  widget.isUpdate = !widget.isUpdate;
                });
              },
            )
          ],
        ),
      ),
    );
  }
}

Проблема: enter image description here

Если я установил в качестве домашней страницы, то работал бы нормально, как показано ниже

import 'package:expense_manager_app/page/splash_page.dart';
import 'package:expense_manager_app/page/update_profile.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or simply save your changes to "hot reload" in a Flutter IDE).
        // Notice that the counter didn't reset back to zero; the application
        // is not restarted.
        brightness: Brightness.dark,
        primaryColor: Colors.red[500],
        accentColor: Colors.green[900],
      ),
      home: UpdateProfile(),
    );
  }
}

enter image description here

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Это из-за того, что вы установили значение по умолчанию bool isUpdate = false;, измените его на bool isUpdate;

и используйте initState метод вашего State класса и установите там isUpdate в значение false.Мне позвонят один раз.

@override
void initState() { 
  widget.isUpdate = false;   
  super.initState();
}
0 голосов
/ 25 декабря 2018

Вы должны переместить вашу переменную isUpdate в ваше состояние, помните, что виджет является неизменяемым.

        class UpdateProfileState extends State<UpdateProfile> {

         bool isUpdate = false;

          @override
          Widget build(BuildContext context) {
            // TODO: implement build
            return Scaffold(
              appBar: AppBar(
                  title: Text("Update"),
                  elevation: 2.0),
              body: Container(
                width: double.infinity,
                height: double.infinity,
                color: Colors.red,
                margin: const EdgeInsets.all(10.0),
                child: Row(
                  children: <Widget>[
                    isUpdate ? new Flexible(child: new TextField()) : Text("Text Widget"),
                    GestureDetector(
                      child: IconTheme(
                          data: IconThemeData(color: Color(0xFFffffff)),
                          child: Icon(Icons.edit)),
                      onTap: () {
                        setState(() {
                          isUpdate = !isUpdate;
                        });
                      },
                    )
                  ],
                ),
              ),
            );
          }
        }

А также измените это:

    Navigator.push(context,MaterialPageRoute(builder: (context) => UpdateProfile()))

На это:

    final page = UpdateProfile();
    Navigator.push(context,MaterialPageRoute(builder: (context) => page ))
...