Issue
I’m a beginner flutter developer and I’m trying to retrieve data from Firestore using Streambuilder. The code was working fine last week, this week I’ve been unable to display user data from Firestore.
The errors I am getting are:
type ‘Null’ is not a subtype of type ‘String’ The relevant error-causing widget was StreamBuilder
A RenderFlex overflowed by 99833 pixels on the right. The relevant error-causing widget was Row
Here’s my code
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter_application_1/main_views/account_method.dart';
class SettingsPage extends StatefulWidget {
@override
_SettingsPageState createState() > _SettingsPageState();
}
FirebaseAuth _auth FirebaseAuth.instance;
final uid _auth.currentUser!.uid;
class _SettingsPageState extends State<SettingsPage> {
String errorMessage '';
@override
Widget build(BuildContext context) {
var boldFont TextStyle(fontFamily: 'Inter', fontWeight: FontWeight.w600);
final Stream<DocumentSnapshot<Map<String, dynamic>>> db
FirebaseFirestore.instance
.collection('users')
.doc(uid)
.collection('Personal details')
.doc()
.snapshots();
return Scaffold(
appBar: AppBar(
titleSpacing: 30,
automaticallyImplyLeading: false,
backgroundColor: Color.fromRGBO(1, 67, 55, 1),
toolbarHeight: 100,
title: new Text(
'Settings',
style: TextStyle(
color: Color.fromRGBO(255, 255, 255, 1),
fontFamily: 'Poppins',
fontSize: 25,
letterSpacing: 1.2,
fontWeight: FontWeight.bold,
height: 1),
),
),
body: SingleChildScrollView(
child: Container(
padding: EdgeInsets.all(30),
color: Color.fromRGBO(246, 246, 246, 1),
child: Column(children: [
SizedBox(
height: 30,
),
Container(
padding: EdgeInsets.only(left: 30, right: 30),
decoration: BoxDecoration(),
child: Text('Account',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
fontFamily: 'Inter'))),
Padding(
padding: EdgeInsets.all(30.0),
child: Column(
children: [
SizedBox(
height: 20,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('First name'),
SizedBox(width: 40),
StreamBuilder<DocumentSnapshot>(
stream: db,
builder: (BuildContext context,
AsyncSnapshot<DocumentSnapshot> snapshot) {
if (snapshot.hasError)
return Text('Something went wrong');
if (snapshot.connectionState
ConnectionState.waiting)
return CircularProgressIndicator();
dynamic data snapshot.data!.data();
return Text(data['First name']);
},
),
]),
Divider(color: Colors.black),
SizedBox(
height: 10,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Last name'),
SizedBox(width: 40),
StreamBuilder<DocumentSnapshot>(
stream: db,
builder: (BuildContext context,
AsyncSnapshot<DocumentSnapshot> snapshot) {
if (snapshot.hasError)
return Text('Something went wrong');
if (snapshot.connectionState
ConnectionState.waiting)
return CircularProgressIndicator();
dynamic data snapshot.data!.data();
return Text(data['Last name'], style: boldFont);
},
),
],
),
Divider(color: Colors.black),
SizedBox(
height: 10,
),
InkWell(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Change password'),
SizedBox(width: 40),
Icon(Icons.arrow_forward, size: 18, color: Colors.black)
],
),
),
Divider(color: Colors.black),
SizedBox(
height: 10,
),
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) > AccountMethod()),
);
},
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Accounts'),
SizedBox(width: 40),
Icon(
Icons.arrow_forward,
color: Colors.black,
size: 19.0,
),
],
),
),
Divider(color: Colors.black),
SizedBox(
height: 30,
),
ElevatedButton(
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(
Color.fromRGBO(1, 67, 55, 1)),
shape:
MaterialStateProperty.all<RoundedRectangleBorder>(
RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20))),
),
child: Text('Log out'),
onPressed: () async {
try {
await FirebaseAuth.instance.signOut();
errorMessage '';
} on FirebaseAuthException catch (error) {
errorMessage error.message!;
}
setState(() {});
Navigator.of(context).pushReplacementNamed('/signIn');
}),
SizedBox(height: 15),
],
),
)
]),
),
),
);
}
}
And here is a screenshot of the firestore db.
Thank you for any assistance in advance
Solution
Okay, I think the problem is from here.
final Stream<DocumentSnapshot<Map<String, dynamic>>> db
FirebaseFirestore.instance
.collection('users')
.doc(uid)
.collection('Personal details')
.doc() // <-- error should be from here.
.snapshots();
You are attempting to stream a document reference that does not exist. .doc()
returns a document reference that does not exist. Rather, use .doc('Path_to_the_document')
.
So add the path to the document that contains Last name
field.
Answered By – Peter O.