1

I am getting this error and I don't know why, type 'Null' is not a subtype of type 'String' The relevant error-causing widget was StreamBuilder<QuerySnapshot<Object?>>

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:market_app/data/Models/single_product_class.dart';
import 'package:market_app/persentation/menu_screens/add_windows_screen.dart';

class WindowsScreen extends StatefulWidget {
  const WindowsScreen({Key? key}) : super(key: key);

  @override
  State<WindowsScreen> createState() => _WindowsScreenState();
}

class _WindowsScreenState extends State<WindowsScreen> {
  CollectionReference windowsCollection =
      FirebaseFirestore.instance.collection("Products");
  List<Product> window = [];
  // WindowsProvider().windows;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.of(context).push(MaterialPageRoute(
              builder: (contextt) => const AddWindowsScreen()));
        },
        child: const Icon(Icons.add),
        backgroundColor: Colors.blueAccent,
      ),
      body: StreamBuilder<QuerySnapshot>(
          stream: windowsCollection.snapshots(),
          builder: (context, snapshot) {
            for (var document in snapshot.data!.docs) {
              Map<String, dynamic> productFromFStore =
                  document.data()! as Map<String, dynamic>;
              
              window.add(Product.fromJson(productFromFStore));
              // window.last.id = document.id;

            }
            if (snapshot.connectionState == ConnectionState.waiting) {
              return const Center(
                child: CircularProgressIndicator(),
              );
            } else if (snapshot.connectionState == ConnectionState.done &&
                snapshot.data == null) {
              return const Center(
                child: Text(" no data to be showen "),
              );
            } else if (snapshot.hasError) {
              return const Text('Something went wrong');
            }

            return GridView.builder(
              gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 2),
              itemBuilder: (context, i) => GridTile(
                header: ListTile(
                  leading: IconButton(
                    icon: const Icon(Icons.favorite),
                    onPressed: () {},
                  ),
                  trailing: IconButton(
                    icon: const Icon(Icons.shopping_cart_outlined),
                    onPressed: () {},
                  ),
                ),
                child: Image.network(window[i].imageUrl,
                    fit: BoxFit.cover),

                // footer: Row(
                //   children: [
                //     Text(windows[i].name),
                //     const Spacer(
                //       flex: 1,
                //     ),s
                //     // Text(windows[i].price)
                //   ],
                // ),
              ),
              itemCount: snapshot.data?.docs.length,
            );
          }),
    );
  }
}

This is product model:

  import 'package:cloud_firestore/cloud_firestore.dart';

class Product {
  final String name;
  final String description;
  late String id;
  final double price;
  final int amount;
  final String imageUrl;

  Product(
      {required this.name,
      required this.description,
      required this.price,
      required this.amount,
      required this.imageUrl,
      id});

  factory Product.fromJson(Map<String, dynamic> data) {
    return Product(
      name: data["name"] ,
      description: data["description"],
      price: double.parse(data["price"]),
      amount: int.parse(data["amount"]),
      imageUrl: data["imageUrl"],
      id: data["id"],
    );
  }
  factory Product.fromSnapshot(DocumentSnapshot snap) {
    Map<String, dynamic> data = snap.data()! as Map<String, dynamic>;
    return Product(
      name: data["name"],
      amount: int.parse(data["amount"]),
      description: data["description"],
      imageUrl: data["imageUrl"],
      price: double.parse(data["price"]),
      id: data["id"],
    );
  }

  Map<String, dynamic> toMap(Product product) {
    return {
      "name": name,
      "description": description,
      "price": price,
      "amount": amount,
      "imageUrl": imageUrl,
      "id": id,
    };
  }
}

I have tried other ways to get the data like // child: Image. network( snapshot.data!.docs[index].data().toString()) but I have got only String, still, I don't know how to fix it, so I need some help

2
  • Hi Khaled, welcome to Stackoverflow. You will find a lot of valuable information here. So hang around. Does your error point to the line where it happens? Generally speaking you try to call a method that doesn't return what you expect and thus returns null. Commented Jan 2, 2022 at 5:34
  • Possible duplicate stackoverflow.com/questions/67917585/… Commented Aug 4, 2022 at 19:39

2 Answers 2

5

The issue comes from parse methods, you can check nullability before parsing data. For example:

...

price: data["price"] == null ? 0 : double.parse(data["price"]),
amount: data["amount"] == null ? 0 : int.parse(data["amount"]),

...

Or you can use this helper method:

num parseNum(String? value) => value == null ? 0 : num.parse(value);

Usage:

...

price: parseNum(data["price"]),
amount: parseNum(data["amount"]),

...
Sign up to request clarification or add additional context in comments.

Comments

2

Yes, dear null gives you an error in Flutter. you need to assign any value to the variable. It will solve your error. It gives an error because you use QuerySnapshot Object and it requires some value. If the value is null it will give you an error. Assign any value to it to solve the error.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.