Flutter - 抽屉作为 sub-class 不更新

Flutter - Drawer as sub-class not updating

我是一个相当缺乏经验的编码员。

我有一个单独创建的抽屉 class。我遇到的问题是抽屉的动态数据未填充。

我希望从共享首选项中检索到的数据应该用 currUserL 的值填充我视图的第三行。

正在正确评估,returns currUserL 的值到控制台,但未在抽屉中更新。

我加载了一个关于按钮(触发更新方法),当手动按下时该按钮可以工作,但只有当抽屉保持打开时数据才会持续存在。当抽屉关闭时它会恢复。

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()),
...

打开时的抽屉

点击后的抽屉(更新)

你能试试这个吗,

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

  return prefs.getString('currUserLast');
}

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

原因:基本上等待调用async方法之前setState

所以我找到了答案,感谢@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');
});

}