JSON вернуть нулевые данные (Flutter) - PullRequest
0 голосов
/ 13 июля 2020
• 1000 1002 * Я пытаюсь получить данные прямо при загрузке экрана, функция выполняется правильно, потому что я печатаю данные в консоли, и она возвращает "null", но когда я go с экрана 1 (экран, на котором я хочу загрузить данные.) на экран 2 (любой экран), а затем обратно на экран 1, данные загружаются на месте и больше не возвращают null, это открывается только при первом запуске команды «flutter run» и go для на этом экране он не работает, но при горячей перезагрузке экрана или go на другой и обратно он снова работает нормально, может ли кто-нибудь мне помочь?

Ниже мой код.

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 Ответ

0 голосов
/ 13 июля 2020

В вашем коде вы неправильно используете переменную isLoading

в начале getChats функции add setState((){ isLoading=true; });

и в конце функции setState((){ isLoading=false; });

, поскольку в настоящее время вы не используете это

происходит то, что ваш макет рисуется, но без данных, поэтому отображается null error, но когда вы вызываете экран, данные были предварительно загружены в другой раз, поэтому ваш макет кажется правильным.

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; });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...