提问者:小点点

JSON返回空数据(Flutter)


我需要加载数据的权利时,屏幕加载,我使用PHP和MYSQL数据库,这些工作良好,检索数据需要检索,所以没有问题。

我正在尝试在屏幕加载时检索数据,由于我在控制台中打印了数据,该函数正在正确地完成,但当我从屏幕1(我要加载数据的屏幕)返回“NULL”时 到屏幕2(任意屏幕),然后回到屏幕1,数据确实在点上加载,不再返回空值,这只在第一次运行命令“flutter run”时打开,并转到那个屏幕,它不工作,但当热重新加载屏幕或转到另一个,回到那个屏幕,它又工作得很好,有人能帮我吗?

下面是我的代码。

class StudentMessages extends StatefulWidget {
  @override
  _StudentMessagesState createState() => _StudentMessagesState();
}

class _StudentMessagesState extends State<StudentMessages> {

  bool isLoading = false;

  Future getChats() async{
     final response = await http.get(
      Uri.encodeFull("https://xxxxxxxxxxxx/xxx/x/x/xx/getChat.php?id=${u.id}&page=$page"),
      headers: {
        "Accept": 'application/json',
      }
    );
    if(response.statusCode == 200){
      setState(() {
        jsonData = jsonDecode(response.body);
        isLoading = true;
      });
      if(jsonData == null){
        print("this shit ain't working fam.");
      }
      print(jsonData);
    }

  }
  void initState(){
    super.initState();
    getChats();
  }

  @override
  Widget build(BuildContext context) {
    if(isLoading == true) {
      return ListView.builder(
        shrinkWrap: true,
        padding: EdgeInsets.all(15),
        itemCount: jsonData == null ? 0 : jsonData.length,
        itemBuilder: (BuildContext context, int index) {
          if(jsonData == null){
            return new Container();
          }else{
            return new Card(
              child: ListTile(
                leading: CircleAvatar(
                  backgroundImage: AssetImage('assets/images/tutor2.jpg'),
                ),
                title: Text('${jsonData[index]['user_firstName']} ${jsonData[index]['user_lastName']}'),
                subtitle: Text(
                  '${jsonData[index]['username']}',
                  overflow: TextOverflow.ellipsis,
                ),
                onTap: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => ChatPage(tutorData: jsonData)),
                  );
                },
              ),
            );
            }
          },
        );
    }else{
      return Center(child:CircularProgressIndicator());
    }
    
    
  }
}


共1个答案

匿名用户

在代码中,您没有正确使用变量IsLoading

getChats函数的开头添加setState((){isloading=true;});

在函数setState((){isloading=false;});的末尾

因为当前您没有使用此

正在绘制布局,但没有数据,因此显示空错误,但当您再次调用屏幕时,数据被预加载,因此布局显示正确。

Future getChats() async{
   setState((){ isLoading=true; });
   final response = await http.get(
    Uri.encodeFull("https://xxxxxxxxxxxx/xxx/x/x/xx/getChat.php?id=${u.id}&page=$page"),
    headers: {
      "Accept": 'application/json',
    }
   );
  
  if(response.statusCode == 200){
      jsonData = jsonDecode(response.body);
      if(jsonData == null){
        print("this shit ain't working fam.");
      }
      print(jsonData);
  }
  setState((){ isLoading=false; });
}