[FIXED] if I set internet off circularprogress indication does not stop

Issue

I am beginner and creating a demo for json data,

here what should I implement my code, so that circularprogressindicator should be gone on if I switch off internet…

I know this is a very basic question but being honest I am totally failing to understand future, so I can’t solve this issue…I am trying to understand with examples…

class _UserScreenState extends State<UserScreen> {

  List<User>? userlist;
  bool isloading=true;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
      ApiServices.getusers().then((value) {
     setState(() {
       userlist=value;
       isloading=false;
     });
   });
    
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body:  isloading==true?Center(child: CircularProgressIndicator()):ListView.builder(
          itemCount: userlist==null?0:userlist!.length,
          itemBuilder: (context,index){
            User user=userlist![index];
            return ListTile(
              title: Text(user.name.toString()),
              subtitle: Text(user.email.toString()),
              leading: CircleAvatar(child: Text(user.id.toString()),),

            );
          }),


    );
  }
}

here is my Api class

class ApiServices
{

  static const String url='https://jsonplaceholder.typicode.com/users';

  static Future<List<User>> getusers() async{

    List<User> userlist=[];
    try
    {
      final response=await http.get(Uri.parse(url));

      if(response.statusCode==200)
      {
        final jsondata=json.decode(response.body);
        userlist.clear();
        for(var data in jsondata)
        {
          userlist.add(User.fromJson(data));
        }
      }
      return userlist;
    }catch(e)
    {
      return userlist;
    }
    return userlist;

  }

}


Solution

you initialize the isLoading = true .
thats why, default widget in your body is circularprogressIndicator

you have to set false first.

 bool isloading=false; // so the circular only show when fetching data
  @override
  void initState() {
    setState((){ isloading= true;});  // show the loading
      ApiServices.getusers().then((value) {
     setState(() {
       userlist=value;
       isloading=false; // false when its complete, 
     });
   });
  super.initState();
    
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
..............

also you can add another condition, when Api failed, then response user is null

you can show something like

userlist.length< 1 ? Text("Data not found") : ....your list tile

Answered By – pmatatias

Answer Checked By – Senaida (Easybugfix Volunteer)

Leave a Reply

(*) Required, Your email will not be published