Flutter - Ящик как подкласс не обновляется - PullRequest
0 голосов
/ 01 сентября 2018

Я довольно неопытный кодер.

У меня есть ящик, который я создал как отдельный класс. У меня проблема в том, что динамические данные для ящика не заполняются.

Я ожидаю, что данные, извлекаемые из общих настроек, должны заполнить третью строку моего представления значением currUserL.

Он оценивается правильно и возвращает значение currUserL на консоль, но не обновляется в ящике.

Я загрузил кнопку «about» (запускающую метод обновления), которая работает при нажатии вручную, но данные сохраняются, только когда ящик остается открытым. Возвращается, когда ящик закрыт.

drawerPatient.dart

class DrawerPatient extends StatefulWidget {
  DrawerPatient({Key key}) : super(key: key);

  @override
  _DrawerPatientState createState() => new _DrawerPatientState();
}

class _DrawerPatientState extends State<DrawerPatient> {
  String currUserL = "nv3";

  Future getPref() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();

    currUserL = prefs.getString('currUserLast');

    debugPrint('user: $currUserL');
  }

  @override
  void initState() {
    getPref();
  }

  void update() {
    setState(() {
      getPref();
    });
  }
  @override
   Widget build(BuildContext context) {
     return Drawer(
        child: new ListView(
          children: <Widget>[
            new DrawerHeader(
              child: new Text('Patient Management'),
              ),
            new ListTile(
              title: new Text('search'),
              onTap: () {},
            ),
            new ListTile(
              title: new Text(currUserL),
              onTap: () {},
            ),
            new Divider(),
            new ListTile(
              title: new Text('About'),
              onTap: update,
            ),
          ],
        ));
     }
 }

userList.dart

class UserList extends StatefulWidget {
  UserList({Key key, this.title}) : super(key: key);

  final String title;
  final String titleHead = "User List";

  @override
  _UserListState createState() => new _UserListState();
  }

class _UserListState extends State<UserList> {
  : sortStr}, headers: {"Accept": "application/json"});

    setState(() {
      data = json.decode(response.body);
    });
    }

  @override
  void initState() {
    this.makeRequest();
//    DrawerPatient().createState().update();
  }


  void _refresh() {
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {

    return new Scaffold(
      appBar: new AppBar(

          title: new Text("Patient List"),

      drawer: new DrawerPatient(key: new UniqueKey()),
...

Ящик при открытии

Drawer when opened

Ящик после нажатия на кнопку (обновить)

Drawer after clicking about (update)

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Так что я нашел ответ, спасибо @Dinesh за то, что он указал мне правильное направление.

Ответ состоял в том, чтобы установить setState как зависимость от асинхронных настроек получения.

Future getPref() async {
SharedPreferences prefs = await SharedPreferences.getInstance();

setState(() {
  currUserI = prefs.getString('currUserId');
  currUserF = prefs.getString('currUserFirst');
  currUserL = prefs.getString('currUserLast');

  debugPrint('user: $currUserL');
});

}

0 голосов
/ 01 сентября 2018

Можете ли вы попробовать это,

Future getCurrentUser() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();

  return prefs.getString('currUserLast');
}

void update() {
  val tempName = getCurrentUser();
  setState(() {
     currUserL = tempName;
  });
}

Причина: В основном ожидание метода async перед вызовом setState

...