Обновление Stateful Widget при вызове его с другими параметрами, а не при обновлении? - PullRequest
0 голосов
/ 19 апреля 2020

я только начал изучать трепетание, я использую виджет с сохранением состояния, следующий код ниже - это файл main.dart

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

class App extends StatefulWidget {
  @override
  _AppState createState() => _AppState();
}

class _AppState extends State<App> {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
        home: new Scaffold(backgroundColor: Colors.blueGrey.shade100,
      body: Home.Homescreen(HomeText: "default",), //initially setting text to default
      appBar: new AppBar(
        centerTitle: true,
        title: new Text("newApp",
            textDirection: TextDirection.ltr,
            style: TextStyle(fontSize:20 ,color: Colors.white)),
      ),
      bottomNavigationBar: new BottomNavigationBar(items: [
        new BottomNavigationBarItem(
            icon: Icon(Icons.home),
            title: new Text(
              "Home",
              textDirection: TextDirection.ltr,
            )),
        new BottomNavigationBarItem(
            icon: Icon(Icons.face),
            title: new Text(
              "Profile",
              textDirection: TextDirection.ltr,
            )),
        new BottomNavigationBarItem(
            icon: Icon(Icons.exit_to_app),
            title: new Text(
              "Exit",
              textDirection: TextDirection.ltr,
            )),
      ],onTap: (int item){
        if(item == 0){
          setState(() {
            Home.Homescreen(HomeText:'this is home'); /* this should change homescreen text but it still says default same for all the below as well*/
          });
        }
        else if(item == 1){
          setState(() {
            Home.Homescreen(HomeText:'this is proile');
          });

        }
        else if(item == 2){
          setState(() {
            Home.Homescreen(HomeText:'this is exit');
          });
        }
      },),
    ));
  }
}

в этом виджете без сохранения состояния вызывается приложение и в _AppState в Scaffold тело назначается виджету без сохранения состояния «HomeScreen», экспортированному как Home в main под BottomNavigationBar, для элементов назначается int, который при нажатии должен соответствующим образом изменить HomeText, но он не обновляется, он остается тем же на домашнем экране, просто говоря «default» это то, что он был первоначально назван, следующий код для home_screen.dart, который называется

class Homescreen extends StatefulWidget{
  Homescreen({this.HomeText}); // init hometext
  String HomeText;
  @override
  _Homescreen createState() => _Homescreen();

}

class _Homescreen extends State<Homescreen>{

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Center(
      child: new Column(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisSize: MainAxisSize.max,
        children: <Widget>[
          new Text(
            widget.HomeText, // this is what should be updated when called
            textDirection: TextDirection.ltr,
            style: new TextStyle(fontSize: 30,color: Colors.black),
          )
        ],
      ),
    );
  }
}

я не понимаю, почему домашний текст не обновляется, когда значки (bottomnavigationbaritems) коснулись, я ' мы проверили значения, используя debugprint, они возвращают 0,1,2. Так, по крайней мере, правильно.

Ответы [ 3 ]

0 голосов
/ 19 апреля 2020
class _AppState extends State<App> {
  String textToDisplay = 'default';
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
        home: new Scaffold(backgroundColor: Colors.blueGrey.shade100,
          body: Homescreen(HomeText: textToDisplay,), //initially setting text to default
          appBar: new AppBar(
            centerTitle: true,
            title: new Text("newApp",
                textDirection: TextDirection.ltr,
                style: TextStyle(fontSize:20 ,color: Colors.white)),
          ),
          bottomNavigationBar: new BottomNavigationBar(items: [
            new BottomNavigationBarItem(
                icon: Icon(Icons.home),
                title: new Text(
                  "Home",
                  textDirection: TextDirection.ltr,
                )),
            new BottomNavigationBarItem(
                icon: Icon(Icons.face),
                title: new Text(
                  "Profile",
                  textDirection: TextDirection.ltr,
                )),
            new BottomNavigationBarItem(
                icon: Icon(Icons.exit_to_app),
                title: new Text(
                  "Exit",
                  textDirection: TextDirection.ltr,
                )),
          ],onTap: (int item){
            if(item == 0){
              setState(() {
               textToDisplay= 'this is home'; /* this should change homescreen text but it still says default same for all the below as well*/
              });
            }
            else if(item == 1){
              setState(() {
               textToDisplay = 'this is proile';
              });

            }
            else if(item == 2){
              setState(() {
                textToDisplay = 'this is exit';
              });
            }
          },),
        ));
  }
}

Примечание: не экспортируйте HomeWidget в качестве home, просто импортируйте файл, в котором он находится, и используйте простое имя класса

Также взгляните на некоторые основы и инструкции по флаттеру c и документацию здесь и здесь например, чтобы сначала ознакомиться с флаттерной системой.

0 голосов
/ 19 апреля 2020

Попробуйте передать ключ, он должен помочь вам, я верю:

Home.Homescreen(HomeText:'this is proile', key: key: ValueKey('this is proile') );

Добавьте ключ и передайте его супер в Homescreen:

class Homescreen extends StatefulWidget{
  Homescreen({Key key, this.HomeText}) : super(key: key); // init hometext
  String HomeText;

  @override
  _Homescreen createState() => _Homescreen();

}

ключ должен быть уникальным, чтобы позволить это знает, что это должно обновить. Вот несколько ссылок о виджетах и ​​ключах:

https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html

https://www.youtube.com/watch?v=kn0EOS-ZiIc&app=desktop

https://medium.com/@ayushpguptaapg /, используя клавиатурные-в-флаттер-1c5fb586b2a5

0 голосов
/ 19 апреля 2020

Попробуйте код ниже:

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

class App extends StatefulWidget {
  @override
  _AppState createState() => _AppState();
}

class _AppState extends State<App> {
  @override
  String homeText = "default";
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
        home: new Scaffold(backgroundColor: Colors.blueGrey.shade100,
      body: Home.Homescreen(HomeText: homeText,), //initially setting text to default
      appBar: new AppBar(
        centerTitle: true,
        title: new Text("newApp",
            textDirection: TextDirection.ltr,
            style: TextStyle(fontSize:20 ,color: Colors.white)),
      ),
      bottomNavigationBar: new BottomNavigationBar(items: [
        new BottomNavigationBarItem(
            icon: Icon(Icons.home),
            title: new Text(
              "Home",
              textDirection: TextDirection.ltr,
            )),
        new BottomNavigationBarItem(
            icon: Icon(Icons.face),
            title: new Text(
              "Profile",
              textDirection: TextDirection.ltr,
            )),
        new BottomNavigationBarItem(
            icon: Icon(Icons.exit_to_app),
            title: new Text(
              "Exit",
              textDirection: TextDirection.ltr,
            )),
      ],onTap: (int item){
        if(item == 0){
          setState(() {
            homeText = "this is home"; 
          });
        }
        else if(item == 1){
          setState(() {
            homeText = "this is profile";
          });

        }
        else if(item == 2){
          setState(() {
            homeText = "this is exit";
          });
        }
      },),
    ));
  }
}

Ваша проблема в том, что вы не меняете свое тело при вызове setState. Когда запускается метод сборки, он всегда имеет одно и то же тело. Используя приведенный выше код, вы обновляете значение homeText, и при запуске метода сборки у homeText появляется новое значение, а ваш текст обновляется.

...