flutter - 颤振列表有时是空的
问题描述
我有以下代码,我从 API 接收到一个带有帖子的列表,当我打开应用程序时,如果我再次保存到代码,列表显示正确,但是每次我重新启动应用程序时列表都是空的,有什么想法吗?我是新来的,所以如果我有一些愚蠢的事情请原谅我
我正在使用 VS,我正在通过 VS 调试器运行应用程序,我也没有收到任何错误,也许列表不可用?
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter1/screen/login.dart';
import 'package:flutter1/network_utils/api.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:developer' as developer;
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home>{
//final List<String> people = ['george','evripides','vicky'];
// var posts;
List<dynamic> posts = [];
String name;
@override
void initState(){
_loadUserData();
_loadPosts();
super.initState();
}
_loadUserData() async{
SharedPreferences localStorage = await SharedPreferences.getInstance();
var user = jsonDecode(localStorage.getString('user'));
//developer.log(user);
if(user != null) {
setState(() {
name = user;
});
}
}
Future _loadPosts() async{
await Network().getDataPosts('post/getallposts?page=1').then((res) {
developer.log("home"+ res.body);
var posts1 = jsonDecode(res.body);
print(posts1);
posts = posts1['data']['data'];
print(posts[1]['title']);
print(posts.length);
return posts.toList();
},
onError: (error) {
print(error);
});
//var res = await Network().getDataPosts('post/getallposts?page=1');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Test App'),
backgroundColor: Colors.teal,
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('Hi, $name',
style: TextStyle(
fontWeight: FontWeight.bold
),
),
new Expanded(
child: posts.isEmpty ? Center(child: Text('Empty')) : ListView.builder(
itemCount: posts.length,
itemBuilder: (context, index) {
var item = posts[index]['title'];
var item2 = posts[index]['comments'];
var item3 = posts[index]['country'];
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 2.0),
child: Card(
elevation: 10.0,
child: ListTile(
title: Text('$item ${item3 == 'Cyprus' ? true : item3}'),
subtitle: Text(item2),
trailing: GestureDetector(
child: Icon(
Icons.dehaze,
color: Colors.black,
),
onTap: () {
setState(() {
posts.remove(item);
});
}),
),
),
);
}),
),
Center(
child: RaisedButton(
elevation: 10,
onPressed: (){
logout();
},
color: Colors.teal,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10))),
child: Text('Logout'),
),
),
],
),
),
);
}
void logout() async{
// var res = await Network().getData('/logout');
// var body = json.decode(res.body);
//if(body['success']){
SharedPreferences localStorage = await SharedPreferences.getInstance();
localStorage.remove('user');
localStorage.remove('token');
Navigator.push(
context,
MaterialPageRoute(builder: (context)=>Login()));
}
}
解决方案
由于从服务器获取数据是异步任务,因此需要时间才能完成,因此当您获取数据时,您必须调用 setState 而您没有调用 setstate,因此您面临这种行为。
setState((){
posts = posts1['data']['data'];
});
推荐阅读
- python - 向绘图添加正确的 Yticks
- python - Django 没有检测到我的模型中的变化
- c# - 如何在我的 ASP Net Core 5.0 项目中比较“ß”和“ss”?
- sql - SQL Server 计算数据窗口中的聚合差异
- angular - Ace 编辑器 setFontSize 不会更改装订线单元图标大小
- c++ - 可变参数模板函数的 1-arg 重载有用吗?它应该使用魔法 && 参考吗?在这种情况下是否发生了复制省略?
- text - 后处理器发生故障时更改 CNC 代码的便捷方法
- bash - 字符串中确切点的 Grep 变量
- c - 通过指向数组的指针返回结果
- airflow - 如何在 Airflow 中将 XCom 值用作运算符外部的全局变量