我有一个设置页面,其中保存了SavedPreferences中一个密钥文件的路径。也可以在此设置页面中重新定义密钥文件的路径。
class Settings extends StatefulWidget {
const Settings({Key? key}) : super(key: key);
@override
_SettingsState createState() => _SettingsState();
}
class _SettingsState extends State<Settings> {
void initState() {
getSettings();
super.initState();
}
void getSettings() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
_keyPath = prefs.getString('keyPath')!;
_keyFile = _keyPath.split('/').last;
}
String _keyPath = '';
String _keyFile = '';
Future<void> openFile() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
_keyPath = (await FlutterFileDialog.pickFile())!;
setState(() {
print(_keyPath);
_keyFile = _keyPath.split('/').last;
prefs.setString('keyPath', _keyPath);
});
}
@override
Widget build(BuildContext context) {
getSettings();
return Scaffold(
appBar: AppBar(
title: const Text('Settings'),
),
body: Column(
children: [
Row(
children: [
Expanded(
child: Column(
children: [
Text('Key File: '),
Text(_keyFile),
],
),
),
Expanded(
child: ElevatedButton(onPressed: openFile, child: Text('Open')),
)
],
)
],
),
);
}
}
这在第一次初始化时很好,但当Widget已经初始化,第二次导航回来时,我在导航回此页面时很难使用SharedPreferences中保存的键。
我知道在中重新导航时,我得到了_keyFile和_keyPath的值
String _keyPath = '';
String _keyFile = '';
无法弄清楚在没有initState的情况下重新导航到小部件以使用SharedPreferences 时如何调用异步函数
我想这应该通过state来完成,而不是从SharedPreferences中查询项目,但我不知道如何准确地做到这一点。
我建议您使用FutureBuilder,而不是在InitState:中获得SharedPreferences
FutureBuilder(
future: SharedPreferences.getInstance(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
// set keys and show your Column widget
} else if (snapshot.hasError) {
// Show error widget
} else {
// Show loading Widget
}
},
),
);
像这样,每次导航到此小部件时,您都会在SharedPreferences中获得保存的值。有关详细信息,您可以查看文档链接。
例如,您可以使用GlobalKey来存储脚手架状态,以显示snackbar等