Flutter Firestore – Null Safety Error When Fetching URL stored as String

Issue

Running into a what appears to be a Null Safety issue when returning a specific key-value pair from Firestore. Specifically, the error is being triggered when trying to read data['thumbnail'] from Firestore. data['thumbnail'] is a URL for an Image, stored as a String in Firestore. I’m able to map through all other items in the document (all others are Strings as well). If I swap out the Firestore reference for an actual image URL, it works. Am I missing something Firestore specific here?

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:getwidget/getwidget.dart';

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

  @override
  _AllArticlesState createState() => _AllArticlesState();
}

class _AllArticlesState extends State<AllArticles> {
  final Stream<QuerySnapshot> _articleStream =
      FirebaseFirestore.instance.collection('all_articles').snapshots();

  @override
  Widget build(BuildContext context) {
    return Container(
        child: StreamBuilder<QuerySnapshot?>(
      stream: _articleStream,
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot?> snapshot) {
        if (snapshot.hasError) {
          return Text('Something went wrong');
        }

        if (snapshot.connectionState == ConnectionState.waiting) {
          return Text("Loading");
        }

        return Expanded(
            child: ListView(
          children: snapshot.data!.docs.map((DocumentSnapshot? document) {
            Map<String?, dynamic> data =
                document?.data() as Map<String?, dynamic>;
            return Card(
                elevation: 5,
                child: SizedBox(
                  height: 80,
                  child: ListTile(
                    leading: GFAvatar(
                        backgroundImage: NetworkImage(data['thumbnail']),
                        shape: GFAvatarShape.standard),
                    title: Text(
                      data['title'],
                      style: TextStyle(
                          fontSize: 14, overflow: TextOverflow.ellipsis),
                    ),
                    subtitle: Text(data['source']),
                    isThreeLine: true,
                  ),
                ));
          }).toList(),
        ));
      },
    ));
  }
}

FULL CONSOLE OUTPUT

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following _TypeError was thrown building StreamBuilder<QuerySnapshot<Object?>>(dirty, state:
_StreamBuilderBaseState<QuerySnapshot<Object?>, AsyncSnapshot<QuerySnapshot<Object?>>>#285c8):
type 'Null' is not a subtype of type 'String'

The relevant error-causing widget was:
  StreamBuilder<QuerySnapshot<Object?>>
  StreamBuilder:file:///Users/bendepew/Developer/aw/pit-road-reporter/prr_flutter/lib/widgets/AllNascarCard.dart:19:16

When the exception was thrown, this was the stack:
#0      _AllNascarCardState.build.<anonymous closure>.<anonymous closure> (package:prr_flutter/widgets/AllNascarCard.dart:41:59)
#1      MappedListIterable.elementAt (dart:_internal/iterable.dart:413:31)
#2      ListIterator.moveNext (dart:_internal/iterable.dart:342:26)
#3      new _GrowableList._ofEfficientLengthIterable (dart:core-patch/growable_array.dart:188:27)
#4      new _GrowableList.of (dart:core-patch/growable_array.dart:150:28)
#5      new List.of (dart:core-patch/array_patch.dart:51:28)
#6      ListIterable.toList (dart:_internal/iterable.dart:213:44)
#7      _AllNascarCardState.build.<anonymous closure> (package:prr_flutter/widgets/AllNascarCard.dart:57:14)
#8      StreamBuilder.build (package:flutter/src/widgets/async.dart:442:81)
#9      _StreamBuilderBaseState.build (package:flutter/src/widgets/async.dart:124:48)
#10     StatefulElement.build (package:flutter/src/widgets/framework.dart:4705:27)
#11     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4588:15)
#12     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#13     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#14     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#15     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#16     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#17     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#18     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#19     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#20     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#21     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#22     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#23     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#24     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#25     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5626:32)
#26     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6284:17)
#27     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#28     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#29     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#30     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#31     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#32     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#33     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#34     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#35     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#36     ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#37     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#38     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#39     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#40     ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#41     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#42     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5626:32)
#43     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6284:17)
#44     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#45     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#46     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#47     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#48     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#49     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#50     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#51     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#52     ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#53     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#54     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#55     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#56     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#57     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#58     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#59     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#60     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#61     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#62     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#63     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#64     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#65     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#66     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#67     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#68     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#69     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#70     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#71     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#72     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#73     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#74     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#75     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#76     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#77     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#78     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#79     ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#80     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#81     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#82     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#83     StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#84     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#85     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#86     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#87     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#88     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#89     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#90     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#91     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#92     ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#93     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#94     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#95     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#96     Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#97     StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#98     Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#99     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#100    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#101    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#102    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#103    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#104    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#105    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#106    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#107    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#108    StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#109    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#110    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#111    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#112    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#113    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#114    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#115    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#116    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#117    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#118    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#119    RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5626:32)
#120    MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6284:17)
#121    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#122    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#123    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#124    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#125    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#126    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#127    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#128    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#129    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#130    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#131    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#132    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#133    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#134    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#135    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#136    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#137    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#138    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#139    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#140    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#141    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#142    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#143    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#144    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#145    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#146    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#147    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#148    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#149    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#150    StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#151    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#152    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#153    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#154    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#155    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#156    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#157    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#158    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#159    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#160    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#161    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#162    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#163    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#164    _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:111:11)
#165    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#166    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#167    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#168    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#169    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#170    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#171    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#172    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#173    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#174    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#175    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#176    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#177    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#178    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#179    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#180    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#181    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#182    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#183    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#184    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#185    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#186    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#187    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#188    StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#189    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#190    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#191    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#192    StatelessElement.update (package:flutter/src/widgets/framework.dart:4669:5)
#193    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#194    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6130:14)
#195    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#196    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#197    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#198    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#199    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#200    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#201    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#202    ProxyElement.update (package:flutter/src/widgets/framework.dart:4943:5)
#203    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#204    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#205    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#206    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#207    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#208    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#209    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#210    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#211    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#212    StatefulElement.update (package:flutter/src/widgets/framework.dart:4795:5)
#213    Element.updateChild (package:flutter/src/widgets/framework.dart:3370:15)
#214    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4613:16)
#215    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#216    Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#217    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2578:33)
#218    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:882:21)
#219    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:363:5)
#220    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1145:15)
#221    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1082:9)
#222    SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:863:7)
(elided 4 frames from class _RawReceivePortImpl, class _Timer, and dart:async-patch)

════════════════════════════════════════════════════════════════════════════════════════════════════

Another exception was thrown: A RenderFlex overflowed by 99409 pixels on the bottom.
Performing hot reload...                                                
Reloaded 1 of 724 libraries in 1,860ms.

Another exception was thrown: type 'Null' is not a subtype of type 'String'

Solution

As you have previously confirmed, the data type is not being correctly handled, you can process Streams using either await for or listen(), you can see it in the Asynchronous programming: Streams. I’m afraid I’m not able to find any of these methods in the code you have provided, pointing this is the main reason to receive a null safety error, as the data type is not being received correctly and causing it to be treated as a null value. This happens in other languages as well, and it’s a common programming mistake.

You will need to add a method to receive the stream and handle the errors, all included in the last link. Please read the documentation carefully and add the missing code, this will help you solve that error. I will leave this video as complement.

Answered By – Alex

Answer Checked By – Gilberto Lyons (FlutterFixes Admin)

Leave a Reply

Your email address will not be published. Required fields are marked *