[英]Flutter, future builder and snapshot.data, the data never gets loaded
[英]Data in future builder is loaded only after restart of app
我從提供程序的列表中獲取數據。 當應用程序打開從 SharedPreferences 添加到那里的數據時,或者如果它是第一次打開,第一個數據來自服務器,然后保存到共享首選項,無論如何它都會從那里添加到此列表中。 問題是只有在重新啟動應用程序后才會在屏幕上顯示數據,而不會在第一次啟動時出現。
Future<void> fetchAndSet() async {
pref = await SharedPreferences.getInstance();
pref.containsKey('users') == true ? getPreferences() : setPreferences();
return _users;
}
setPreferences() async {
ApiManager()
.fetch()
.then((value) => pref.setString('users', value))
.then((value) => getPreferences());
}
Future getPreferences() async {
var jsonMap = json.decode(pref.getString('users'));
var isThere = false;
for (var el in jsonMap) {
var newEl = User.fromJson(el);
for (var user in _users) {
if (user.id == newEl.id) {
isThere = true;
}
}
if (!isThere) {
_users.add(newEl);
}
}
}
body: FutureBuilder(
future:
Provider.of<UsersData>(this.context, listen: true).fetchAndSet(),
builder: (context, snapshot) => snapshot.connectionState !=
ConnectionState.done
? Center(child: CircularProgressIndicator())
: ListView.builder(
itemCount: Provider.of<UsersData>(this.context, listen: true)
.users
.length,
itemBuilder: (context, index) {
return GestureDetector(
onTap: () => Navigator.of(context).push(MaterialPageRoute(
builder: (context) => DetailsScreen(
Provider.of<UsersData>(this.context, listen: true)
.users[index]
.id))),
child: Container(
您是否在這段代碼中測試過將listen
更改為false
? 我認為它應該是false
而不是true
,然后更改這一行:
Provider.of<UsersData>(this.context, listen: true).fetchAndSet(),
到
Provider.of<UsersData>(this.context, listen: false).fetchAndSet(),
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.