firebase - Flutter:NoSuchMethodError(NoSuchMethodError:在 null 接收器上调用了 getter 'isEmpty':null 尝试调用:isEmpty)
问题描述
我在消息屏幕上的 listview.builder 中显示来自 firebase 的所有用户,当我单击列表中的用户时,我希望将其发送到聊天屏幕,该屏幕在应用栏中显示该用户的个人资料图像和名称。
代码在此异常上暂停:
backgroundImage: widget.receiver.profileImageUrl.isEmpty
? AssetImage(
'assets/images/default_profile_picture.png')
: CachedNetworkImageProvider(
widget.receiver.profileImageUrl)),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
widget.receiver.name
相关列表视图:
body: ListView.builder(
itemCount: usersList.length,
itemBuilder: ((context, index) {
return Padding(
padding: const EdgeInsets.all(4.0),
child: InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: ((context) => ChatScreen(
profileImageUrl: usersList[index].profileImageUrl,
name: usersList[index].name,
receiverUid: usersList[index].uid,
// receiverUid: widget.currentUserId,
userId: widget.currentUserId,
receiver: user,
)
)
));
},
child: ListTile(
leading: CircleAvatar(
backgroundImage: usersList[index].profileImageUrl.isEmpty
? AssetImage(
'assets/images/default_profile_picture.png')
: CachedNetworkImageProvider(
usersList[index].profileImageUrl)),
title: Text(usersList[index].name),
),
),
);
}),
)
聊天画面构造函数:
class ChatScreen extends StatefulWidget {
final String profileImageUrl;
final String name;
final String receiverUid;
final User sender;
final User receiver;
final String userId;
ChatScreen(
{this.profileImageUrl,
this.name,
this.receiverUid,
this.sender,
this.receiver,
this.userId});
@override
_ChatScreenState createState() => _ChatScreenState();
}
聊天屏幕初始化状态:
@override
void initState() {
super.initState();
_repository.getCurrentUser().then((user) {
_currentUserId = user.uid;
setState(() {
sender = User(
id: user.uid,
name: user.displayName,
profileImageUrl: user.photoUrl);
});
});
_repository.getUserWithId(widget.userId).then((user) {
setState(() {
receiver = User(
id: user.id,
profileImageUrl: user.profileImageUrl,
name: user.name);
});
});
}
消息屏幕构造函数:
class MessagesScreen extends StatefulWidget {
final String userId;
final User receiver;
final String currentUserId;
final String receiverUid;
MessagesScreen(
{this.userId, this.receiver, this.currentUserId, this.receiverUid});
@override
_MessagesScreenState createState() => _MessagesScreenState();
}
解决方案
那是因为您的某些用户中的 profileImageUrl 为空。在 .isEmpty 使用之前添加空检查?运算符。它检查空值。
backgroundImage: (widget.receiver.profileImageUrl?.isEmpty ?? true)
? AssetImage(
'assets/images/default_profile_picture.png')
: CachedNetworkImageProvider(
widget.receiver.profileImageUrl)),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
widget.receiver.name
推荐阅读
- sql - 删除和创建后从数据库中恢复 SQL 表
- etw - ETW 中的对象句柄跟踪
- scala - scala中的(1到10乘3)toList和(1到10乘3).toList有什么区别(或intellij问题?)
- c# - 如何从 IHttpControllerSelector 返回状态码?
- ibm-cloud - ibmcloud login 命令在提供凭证后关闭
- multithreading - 我如何确保表单干净并重新绘制?,即使在我清空位图后,一些 Timage 仍保留在屏幕上
- html - 如何让 Django 在数据库中显示我想要的内容
- c# - 如何设置 GridSplitter 对网格的喜爱
- asp.net-mvc - 列出来自多个表的数据,但作为 1 条记录
- reactjs - 反应:无法获取组件列表