简体   繁体   中英

Flutter Firestore StreamBuilder getting null value initially

I'm trying to get data from firestore by using stream builder method. initially, when I run the app I don't get any data from firebase. I'm getting Invalid value: Valid value range is empty: 0 . once I reload app the data is available please find the code bellow

Widget build(BuildContext context) {
    return StreamBuilder(
        stream: Firestore.instance
            .collection('users/')
            .where('uid', isEqualTo: _userUID)
            .snapshots(),
        builder: (BuildContext context, userSnapshot) {
          if (!userSnapshot.hasData) return WidgetFunctions().loadingWidget();
          return StreamBuilder(
              stream: Firestore.instance
                  .collection('products')
                  .where('latest', isEqualTo: true)
                  .snapshots(),
              builder: (cuserSnapshotontext, snapshot) {
                if (!snapshot.hasData) return WidgetFunctions().loadingWidget();
                if (snapshot.data.documents.length == 0)
                  return const Center(
                    child: Text(
                      "Not Available",
                      style: TextStyle(fontSize: 30.0, color: Colors.grey),
                    ),
                  );

                if (!userSnapshot.data.documents[0]['productViewPermission']) {
                  print('place6');
                  return const Center(
                      child: Text(
                    'You dont have permission to view products \n please contect us',
                    style: TextStyle(
                        fontSize: 18.0,
                        color: Colors.red,
                        fontWeight: FontWeight.bold),
                  ));
                }
                return GridView.builder(
                  shrinkWrap: true,
                  scrollDirection: Axis.vertical,
                  itemCount: snapshot.data.documents.length,
                  gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
                    crossAxisCount: 2,
                  ),
                  itemBuilder: (BuildContext context, int index) {
                    return SingleProduct(
                        productCatagory: snapshot.data.documents[index]
                            ['productCatogary'],
                        productName: snapshot.data.documents[index]
                            ['productName'],
                        imageURL: snapshot.data.documents[index]['imageURLS']
                            [0],
                        price: userSnapshot.data.documents[0]
                                ['priceViewpermission']
                            ? snapshot.data.documents[index]['price'].toDouble()
                            : "To view price please contect us",
                        discountBool: snapshot.data.documents[index]
                            ['discount'],
                        discountValue: snapshot.data.documents[index]
                            ['discountValue'],
                        index: index,
                        description: snapshot.data.documents[index]
                            ['description'],
                        make: snapshot.data.documents[index]['make'],
                        karat: snapshot.data.documents[index]['karat'],
                        waight:
                            snapshot.data.documents[index]['waight'].toDouble(),
                        condition: snapshot.data.documents[index]['condition'],
                        populer: snapshot.data.documents[index]['populer'],
                        isAvailable: snapshot.data.documents[index]
                            ['isAvailable']);
                  },
                );
              });
        });
  }

I/flutter ( 3686): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter ( 3686): The following RangeError was thrown building StreamBuilder<QuerySnapshot>(dirty, state:
I/flutter ( 3686): _StreamBuilderBaseState<QuerySnapshot, AsyncSnapshot<QuerySnapshot>>#02fde):
I/flutter ( 3686): RangeError (index): Invalid value: Valid value range is empty: 0
I/flutter ( 3686): When the exception was thrown, this was the stack:
I/flutter ( 3686): #0      List.[] (dart:core-patch/growable_array.dart:145:60)
I/flutter ( 3686): #1      _PopularProductsContainerState.build.<anonymous closure>.<anonymous closure> (package:thaya_factory/Components/HomePageComponents/CategoryComponent/LatestProductsComponent.dart:54:49)
I/flutter ( 3686): #2      StreamBuilder.build (package:flutter/src/widgets/async.dart:425:74)
I/flutter ( 3686): #3      _StreamBuilderBaseState.build (package:flutter/src/widgets/async.dart:125:48)
I/flutter ( 3686): #4      StatefulElement.build (package:flutter/src/widgets/framework.dart:4012:27)
I/flutter ( 3686): #5      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3924:15)
I/flutter ( 3686): #6      Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
I/flutter ( 3686): #7      BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2340:33)
I/flutter ( 3686): #8      _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:700:20)
I/flutter ( 3686): #9      _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:285:5)
I/flutter ( 3686): #10     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1016:15)
I/flutter ( 3686): #11     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:958:9)
I/flutter ( 3686): #12     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:874:5)
I/flutter ( 3686): #16     _invoke (dart:ui/hooks.dart:236:10)
I/flutter ( 3686): #17     _drawFrame (dart:ui/hooks.dart:194:3)
I/flutter ( 3686): (elided 3 frames from package dart:async)
I/flutter ( 3686): ═══════════════════════

Please help me to fix the issue Thanks in advance

Well first of all, this block of code has invalid syntax:

if (snapshot.data.documents.length == 0)
  return const Center(
    child: Text(
      "Not Available",
      style: TextStyle(fontSize: 30.0, color: Colors.grey),
    ),
  );

You forgot the opening and closing brackets on the if statement.

And secondly, try an else if on the second if statement, because now, when snapshot.data.documents.length returns null , it will still check for !userSnapshot.data.documents[0] , though the list is empty, which is the cause for your RangeError .

So try this:

if (snapshot.data.documents.length == 0) {
  return const Center(
    child: Text(
      "Not Available",
      style: TextStyle(fontSize: 30.0, color: Colors.grey),
    ),
  );
} else if (!userSnapshot.data.documents[0]['productViewPermission']) {
  print('place6');
  return const Center(
    child: Text(
      'You dont have permission to view products \n please contect us',
      style: TextStyle(
        fontSize: 18.0,
        color: Colors.red,
        fontWeight: FontWeight.bold),
      )
    );
}

This is because itemCount of GridView is accessing no data snaphsot.

Try doing

itemCount = snapshot.data== null ? 0 : snapshot.data.documents.length;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM