Flutter 颤振FutureBuilder()导致一秒钟的空异常
错误出现在以下两行:Flutter 颤振FutureBuilder()导致一秒钟的空异常,flutter,dart,google-cloud-firestore,flutter-provider,flutter-futurebuilder,Flutter,Dart,Google Cloud Firestore,Flutter Provider,Flutter Futurebuilder,错误出现在以下两行: backgroundImage:snapshot.data[“imageUrl”]==null & builder:(上下文,快照)=>Text(snapshot.data[“displayName”] 所以我不确定是否诚实。我认为这是FutureBuilder()的原因,因为没有它们,我就不会有例外。 我是新手,所以任何建议都将不胜感激!您可以将initialData参数设置为StreamProvider,该数据在流尚未发出任何信息时使用。 在访问其中一个键之前,您还应该
backgroundImage:snapshot.data[“imageUrl”]==null
&
builder:(上下文,快照)=>Text(snapshot.data[“displayName”]
所以我不确定是否诚实。我认为这是FutureBuilder()
的原因,因为没有它们,我就不会有例外。
我是新手,所以任何建议都将不胜感激!您可以将initialData参数设置为StreamProvider,该数据在流尚未发出任何信息时使用。
在访问其中一个键之前,您还应该检查_userSnapshot.data!=null。您正试图调用
\u userSnapshot.data[]
但是数据
为null
,您必须首先确保\u userSnapshot
不为null并且\u userSnapshot.data
也不为null。同时,考虑装入一个加载器,可以使用<代码>循环进度指示器< /代码>作为一个简单的开始,或者你可以从Pu.DeV使用<代码> Shimmer < /Cult>库,用于一些很酷的占位符加载动画(比如脸谱网)。但是数据是空的,你必须首先确保_userSnapshot不是空的,并且_userSnapshot.data我会检查的,谢谢,但是请记住,我的手机屏幕上会显示半秒钟的黄黑色条纹,然后它会以某种方式正确地显示图像。所以你必须考虑放置一个占位符,以避免让它变得怪异,CircularProgressIndicator作为开始,您可以使用pub.dev中的Shimmer库加载一些很酷的占位符(如facebook)。是的,我已经考虑过了。我猜某些操作需要它!谢谢,不,我声明了snapshot.data,它修复了我猜的问题。
class MyClass extends StatelessWidget {
@override
Widget build(BuildContext context) {
var _userSnapshot;
List<dynamic> myContactsList;
return StreamProvider<DocumentSnapshot>.value(
value: DatabaseService("").myUser,
builder: (context, child) => Expanded(
child: Container(
child: (_userSnapshot = Provider.of<DocumentSnapshot>(context)) ==
null ||
(myContactsList = _userSnapshot.data["contacts"]) == null
? Padding(
// if no contacts were found
padding: EdgeInsets.all(10.0),
child: Column(
children: <Widget>[
Text(
"No recent chats yet",
),
],
),
)
: ListView.builder(
itemCount: _userSnapshot.data["contacts"].length,
itemBuilder: (context, index) => FutureBuilder(
future: DatabaseService("").getUserById(
myContactsList.elementAt(index),
),
builder: (context, snapshot) => GestureDetector(
onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (_) => ChatScreen(
myContactsList.elementAt(index),
snapshot.data["displayName"],
),
),
),
child: Container(
margin: EdgeInsets.only(top: 5, bottom: 5, right: 20),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
children: <Widget>[
FutureBuilder(
future: DatabaseService("").getUserById(
myContactsList.elementAt(index),
),
builder: (context, snapshot) =>
CircleAvatar(
radius: 33,
backgroundImage: snapshot
.data["imageUrl"] ==
null
? snapshot.data["isMale"] == true
? AssetImage(
"assets/images/male.png")
: AssetImage(
"assets/images/female.png")
: AssetImage(
"assets/images/male.png"),
),
),
SizedBox(width: 10),
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
FutureBuilder<DocumentSnapshot>(
future: DatabaseService("").getUserById(
myContactsList.elementAt(index),
),
builder: (context, snapshot) => Text(
snapshot.data["displayName"],
style: TextStyle(
color: Colors.grey,
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
SizedBox(height: 5),
Container(
width:
MediaQuery.of(context).size.width *
0.45,
child: Text(
"Something N. $index ",
style: TextStyle(
color: Colors.blueGrey,
fontSize: 18,
fontWeight: FontWeight.w600,
),
overflow: TextOverflow.ellipsis,
),
),
],
),
],
),
Column(
children: <Widget>[
Text(
"TIME"
),
Container(
height: 20,
width: 40,
decoration: BoxDecoration(
color: Theme.of(context).primaryColor,
borderRadius: BorderRadius.circular(30),
),
alignment: Alignment.center,
child: Text(
"NEW",
style: TextStyle(
color: Colors.white,
fontSize: 11,
fontWeight: FontWeight.bold,
),
),
),
],
),
],
),
),
),
),
),
),
),
),
);
}
}
The following NoSuchMethodError was thrown building FutureBuilder<DocumentSnapshot>(dirty, state: _FutureBuilderState<DocumentSnapshot>#98dd9):
The method '[]' was called on null.
Receiver: null
Tried calling: []("imageUrl")
The relevant error-causing widget was:
FutureBuilder<DocumentSnapshot> file:///home/pss/Desktop/android/flutter_firebase_chat_app/lib/widgets/recent_chats.dart:90:35
When the exception was thrown, this was the stack:
#0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1 RecentChats.build.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter_firebase_chat_app/widgets/recent_chats.dart:98:56)
#2 _FutureBuilderState.build (package:flutter/src/widgets/async.dart:740:55)
#3 StatefulElement.build (package:flutter/src/widgets/framework.dart:4663:28)
#4 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4546:15)
...
════════════════════════════════════════════════════════════════════════════════════════════════════
Another exception was thrown: NoSuchMethodError: The method '[]' was called on null.
════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The method '[]' was called on null.
Receiver: null
Tried calling: []("displayName")
The relevant error-causing widget was:
FutureBuilder<DocumentSnapshot> file:///home/pss/Desktop/android/flutter_firebase_chat_app/lib/widgets/recent_chats.dart:114:39