Flutter 如何在构建上下文中获取共享首选项

Flutter 如何在构建上下文中获取共享首选项,flutter,output,Flutter,Output,我正在使用颤振制作一个小部件AppBar抽屉,并将数据保存在SharedReferences中。。。 这是我的抽屉。达特: 类AppDrawer扩展StatefulWidget{ @override _AppDrawerState createState() => _AppDrawerState(); } class _AppDrawerState extends State<AppDrawer> { SharedPreferences prefs; Fut

我正在使用颤振制作一个小部件AppBar抽屉,并将数据保存在SharedReferences中。。。 这是我的抽屉。达特: 类AppDrawer扩展StatefulWidget{

  @override
  _AppDrawerState createState() => _AppDrawerState();
}

class _AppDrawerState extends State<AppDrawer> {
  SharedPreferences prefs;

  Future<void> logOut() async {
    final prefs = await SharedPreferences.getInstance();

    prefs.clear();
    Navigator.pushReplacementNamed(
      context,
      '/login',
    );
  }

  @override
  Widget build(BuildContext context) {
    final deviceSize = MediaQuery.of(context).size;
    return Drawer(
      child: ListView(
        children: <Widget>[
          DrawerHeader(
            child: Text(prefs.getString('first_name')),
            decoration: BoxDecoration(
              color: Colors.red,
            ),
          ),
          ListTile(
            leading: Text('LogOut'),
            onTap: logOut,
          ),
        ],
      ),
    );
  }
}
@覆盖
_AppDroperState createState()=>\u AppDroperState();
}
类_AppDroperState扩展状态{
共享引用优先权;
将来注销()异步{
final prefs=wait SharedPreferences.getInstance();
prefs.clear();
Navigator.pushReplacementNamed(
上下文
“/login”,
);
}
@凌驾
小部件构建(构建上下文){
final deviceSize=MediaQuery.of(context).size;
回程抽屉(
子:ListView(
儿童:[
抽屉阅读器(
子:文本(prefs.getString('first_name')),
装饰:盒子装饰(
颜色:颜色,红色,
),
),
列表砖(
前导:文本(“注销”),
onTap:注销,
),
],
),
);
}
}
我使用它注销的方式是清除它们,但是当我想在小部件构建中使用它时,它会给我一个空响应。。。 我正在尝试prefs.getString('first_name'),但它给了我空值:(
我做错了什么???

您需要像这样实现它

class _AppDrawerState extends State<AppDrawer> {
  
  String name = "";
  SharedPreferences prefs;

  @override
  void initState() {
    super.initState();
    getName();
  }

  getName() async {
    final prefs = await SharedPreferences.getInstance();
    setState((){
      name = prefs.getString('first_name');
    });
  }

  Future<void> logOut() async {
    prefs.clear();
    Navigator.pushReplacementNamed(
      context,
      '/login',
    );
  }

  @override
  Widget build(BuildContext context) {
    final deviceSize = MediaQuery.of(context).size;
    return Drawer(
      child: ListView(
        children: <Widget>[
          DrawerHeader(
            child: Text(this.name),
            decoration: BoxDecoration(
              color: Colors.red,
            ),
          ),
          ListTile(
            leading: Text('LogOut'),
            onTap: logOut,
          ),
        ],
      ),
    );
  }
}
class\u应用程序状态扩展状态{
字符串名称=”;
共享引用优先权;
@凌驾
void initState(){
super.initState();
getName();
}
getName()异步{
final prefs=wait SharedPreferences.getInstance();
设置状态(){
name=prefs.getString('first_name');
});
}
将来注销()异步{
prefs.clear();
Navigator.pushReplacementNamed(
上下文
“/login”,
);
}
@凌驾
小部件构建(构建上下文){
final deviceSize=MediaQuery.of(context).size;
回程抽屉(
子:ListView(
儿童:[
抽屉阅读器(
子项:文本(此.name),
装饰:盒子装饰(
颜色:颜色,红色,
),
),
列表砖(
前导:文本(“注销”),
onTap:注销,
),
],
),
);
}
}
wait SharedPreferences.getInstance();
是一个异步调用,不能在initState方法或build widget方法中进行异步调用。因此,我创建了一个单独的函数来获取首选项,然后更新了状态变量
name