flutter - 如何在小部件构建之前获取共享偏好数据?
问题描述
我有一些带有提示文本和底部导航的文本字段。输入到文本字段(在第 1 页)中的文本将保存到“更改时”共享首选项。
当我单击底部导航下一页(第 2 页)并再次返回第 1 页时,似乎小部件重建,并将在共享首选项存储数据显示在小部件上之前显示提示文本。
我试图在 initState 期间获取 sharedpreference 数据,但它不起作用。我也尝试过使用未来的构建器,但是当我在 TextField 中输入值时不是那么流畅,有时文本会在字符之前和之后的字符之间闪烁。我不确定我应该使用哪种方法,或者我的编码是否错误。
有人可以建议我应该使用哪种方法吗?
提前致谢!
登录.dart
@override
Widget build(BuildContext context){
return new Scaffold(
appBar: new AppBar(
title: Text('Login Page'),
),
body: bottomNav[currentBottomNavIndex],
bottomNavigationBar: BottomNavigationBar(
onTap: onTapped,
currentIndex: currentBottomNavIndex,
type: BottomNavigationBarType.fixed,
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),
title: Text("Page1"),
),
BottomNavigationBarItem(
icon: Icon(Icons.mail),
title: Text('Page2'),
),
],
),
);
}
page1.dart
class Page1 extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _Page1State();
}
}
class _Page1State extends State<Page1> {
TextEditingController name = TextEditingController();
String name_str;
Future<String> getName(String key) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
name_str = prefs.getString(key);
setState(() {
name = new TextEditingController(text: name_str);
});
return name_str;
}
Future<bool> setName(String key, String value) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.setString(key, value);
}
@override
void initState() {
super.initState();
getName('name');
}
@override
Widget build(BuildContext context) {
//return FutureBuilder(
//future: getName('name'),
//builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
// if (snapshot.hasData) {
return Container(
margin: EdgeInsets.all(100.0),
width: 185,
child: Center(
child: TextField(
controller: name,
textAlign: TextAlign.center,
decoration: new InputDecoration(
hintText: "Name (Original)",
),
onTap:() {
name.clear();
setName('name', '');
},
onChanged: (String str) {
setState(() {
name_str = str;
setName('name', str);
});
},
)
)
);
// }else{
// return Container();
// }
// }
//);
}
}
Page2.dart
class Page2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: Center(
child: Text('Page2'),
),
);
}
}
解决方案
我认为问题出在这里
setState(() {
name = new TextEditingController(text: name_str);
});
这样做
新的 TextEditingController(文本:name_str);
将创建一个新实例,而只是使用共享首选项更新名称控制器的值。
setState(() {
name.text=name_str;
});
这应该适合你
推荐阅读
- python - 遍历到基类
- c# - 如何使用 C# 在 ASP.NET 中中止请求,如 IIS 请求中止
- python - 如何动态提供文件,然后让它们在 Django 中可下载?
- gem5 - 在 gem5 中恢复检查点时,我可以更改哪些系统特征,例如缓存配置的核心数?
- angular - Angular 绑定复选框到 BehaviorSubject
- python - 如何在 VS Script 中上传或构建文件?
- python-3.x - 在导入的库中加载环境变量时如何将导入保持在文件顶部?
- php - 如何一起使用 tax_query 和 meta_query?
- android - 如何使用 EXPLORE-NFC-WW 从带有 React-Native 设备的 Android 向 RaspberryPi 发送一个简单的字符串
- python-3.x - Bottle - 处理 POST 数据后重定向