setState, чтобы изменения сразу появлялись в интерфейсе при флаттере - PullRequest
0 голосов
/ 17 июня 2020

Я работаю над обновлением своего имени пользователя в firebase и хочу, чтобы это изменение немедленно появилось в интерфейсе. Как мне установить для этого состояние? Это код, который я написал для кнопки «обновить». Спасибо!

RaisedButton(
              onPressed: () async { //change username

                  FirebaseUser user = await Provider.of(context).auth.getCurrentUser();
                  UserUpdateInfo updateInfo = UserUpdateInfo();
                  updateInfo.displayName = _newUsernameController.text;
                  user.updateProfile(updateInfo);
                  print('USERNAME IS: ${user.displayName}');

                  setState(() {
                    //user.displayName = _newUsernameController;
                  });
                    Navigator.pop(context);

                    },
                  color: Colors.indigo,
                  shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(50)),
                  child: Padding(
                    padding: EdgeInsets.only(top: 10, bottom: 10, left: 20, right: 20),
                  child: Text("Save", style: TextStyle(color: Colors.white,
                  fontWeight: FontWeight.bold, fontSize: 15),
                    ),
                  ),
                )

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Вы можете присвоить user.displayName переменной внутри setState и отобразить эту переменную.

String username = 'Old Name';

...

child: Column(
    children: <Widget>[
        Text(username), // HERE!
        RaisedButton(
              onPressed: () async { //change username

                  FirebaseUser user = await Provider.of(context).auth.getCurrentUser();
                  UserUpdateInfo updateInfo = UserUpdateInfo();
                  updateInfo.displayName = _newUsernameController.text;
                  user.updateProfile(updateInfo);
                  print('USERNAME IS: ${user.displayName}');

                  setState(() {
                    username = user.displayName;
                  });
                    // Navigator.pop(context); why???

                    },
                  color: Colors.indigo,
                  shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(50)),
                  child: Padding(
                    padding: EdgeInsets.only(top: 10, bottom: 10, left: 20, right: 20),
                  child: Text("Save", style: TextStyle(color: Colors.white,
                  fontWeight: FontWeight.bold, fontSize: 15),
                    ),
                  ),
                ),
    ],
),
0 голосов
/ 17 июня 2020

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

Взгляните на эту страницу документации из Flutter Docs, это отлично подходит для понимания основ управления состоянием.

Также user.updateProfile(updateInfo) является асинхронным задача . Возможно, вы захотите подождать его, прежде чем предпринимать дальнейшие действия, например, вернуться назад.

...