Home > other >  Flutter , type 'Null' is not a subtype of type 'String'
Flutter , type 'Null' is not a subtype of type 'String'

Time:01-02

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

CodePudding user response:

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

CodePudding user response:

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"]),

...
  • Related