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