flutterhttprequestflutter-providerstate-managementinherited-widget

Trying to make http call via VxMutation & VxState in Flutter


I'm trying to fetch banner data from JSON using HTTP.get. I did fetch the data successfully but there is something wrong which is causing this error:

enter image description here

It shows the following error for 2 seconds and then loads images. It doesn't show the loading widget I put. I believe the Build method is building widgets before getting HTTP data. Is this the case then why it's not showing CircularProgressIndicator?

enter image description here

after 2-3 seconds:

enter image description here

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  @override
  void initState() {
    FetchBanners(); //<--------is this right?
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final banner = (VxState.store as MyStore).bannerModel;
    VxState.watch(context, on: [FetchBanners]);
    return Scaffold(
      body: Column(
        children: [
          VxBuilder(
            mutations: {FetchBanners},
            builder: (context, store, status) => VxSwiper.builder(
              aspectRatio: 4 / 1.75,
              enableInfiniteScroll: true,
              itemCount: 4,
              itemBuilder: (context, index) => Container(
                  child: banner!.items![index].url != null
                      ? Image(
                          image: NetworkImage(banner.items![index].url!), //<-----Null check operator used on a null value
                        )
                      : CircularProgressIndicator()), //<---Why Error and Not This??
            ),
          ),
        ],
      ),
    );
  }
}

class FetchBanners extends VxMutation<MyStore> {
  Future perform() async {
    final url = "https://jsonplaceholder.typicode.com/albums/2/photos";
    var response = await http.get(Uri.parse(url));

    if (response.statusCode == 200) {
      final decodedData = jsonDecode(response.body);
      store?.bannerModel?.items =
          List.from(decodedData).map<BannerItem>((item) {
        return BannerItem.fromMap(item);
      }).toList();
     
      print(store?.bannerModel?.items![0].url); // But This Prints actual Result!!!
    } else {}
  }
}

I've used VelocityX Package here. and VxState for State-Management as part of VelocityX.


Solution

  • Solved it. It was the null safety operator's confusion!!

    Dart wanted to go to the next line ONLY if it's not null. and checking for Null should not contain "!" but "?" Problem was, I was checking with "!= null" instead of "== null"

     child: banner?.items?[index].url == null
                            ? CircularProgressIndicator()
                            : Image(
                                image: NetworkImage(banner!.items![index].url!),
                                fit: BoxFit.cover,
                              )