為了解決第一個問題,我目前使用的方法是在加載檔案時異步放入一個content變數,body加載完成后,呼叫setState()并設定content.
class _MyHomePageState extends State<MyHomePage>{
dynamic content;
void setContent(bool? hasRes){
setState(() {
if(hasRes!=null&&hasRes){
content = const ContentWhenHasRes();
}else{
content = const ContentWhenNoRes();
}
});
}
@override
Widget build(BuildContext context){
//Load the $hasRes$ var and determine which interface to draw
SharedPreferences.getInstance().then((pref) => {
setContent(pref.getBool('hasRes'))
});
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: content
);
}
}
但我不知道這是否有效,有沒有更優雅的方法來做到這一點?另外,我發現從本地存盤加載串列以在 ListView 中顯示是有問題的。我知道使用`ListView.builder' 但是,我的問題仍然是 i/o 部分。
uj5u.com熱心網友回復:
另一種方法是 setState() hasRes 變數:
class _MyHomePageState extends State<MyHomePage>{
bool _hasRes = false;
@override
void initState() {
super.initState();
//Do this in initState()
SharedPreferences.getInstance().then((pref) => {
_hasRes = pref.getBool('hasRes');
setState((){});
});
}
@override
Widget build(BuildContext context){
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: _hasRes ? ContentWhenHasRes() : ContentWhenNoRes(),
);
}
}
uj5u.com熱心網友回復:
SharedPreferences.getInstance().then((pref) => {
setContent(pref.getBool('hasRes'))
});
這些代碼不應該放在 build() 方法中,因為 build() 方法執行頻繁,將 io 代碼放在 initState() 中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/370353.html
上一篇:如何在javascriptfor-of循??環中跳過第一次迭代
下一篇:Dart中的異步編程不起作用
