我目前正在浏览Flutter Firebase代码框here。
我已按照所有步骤操作,但在尝试使用itemBuilder
小部件的FirebaseAnimatedList
时遇到两个错误。
与sort: (a, b) => b.key.compareTo(a.key)
:
函数表达式类型'(动态,动态)→动态'不是'(DataSnapshot,DataSnapshot)→int'类型。这意味着它的参数或返回类型与预期的不匹配。请考虑更改参数类型或返回的类型。
我是否需要将(a,b)
转换为DataSnapshot
?
与itemBuilder
的{{1}}相关联。
参数类型'(BuildContext,DataSnapshot,Animation,int)→dynamic'无法分配给参数类型'(BuildContext,DataSnapshot,Animation)→Widget'。
在这种情况下,似乎需要传入索引,并且FirebaseAnimatedList
返回错误的类型。我不确定如何解决这些问题。
以下是我的代码。
ChatMessage
类ChatScreenState
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: AppBar(
title: Text('friendlychat'),
),
body: Column(
children: <Widget>[
Flexible(
child: FirebaseAnimatedList(
query: reference,
sort: (a, b) => b.key.compareTo(a.key),
padding: EdgeInsets.all(8.0),
reverse: true,
itemBuilder: (BuildContext context, DataSnapshot snapshot,
Animation<double> animation, int index) {
return ChatMessage(snapshot: snapshot, animation: animation);
},
),
),
Divider(height: 1.0),
Container(
decoration: BoxDecoration(color: Theme.of(context).cardColor),
child: _buildTextComposer(),
)
],
));
}
class ChatMessage
class ChatMessage extends StatelessWidget {
ChatMessage({this.snapshot, this.animation});
final DataSnapshot snapshot;
final Animation animation;
@override
Widget build(BuildContext context) {
return SizeTransition(
sizeFactor: CurvedAnimation(parent: animation, curve: Curves.easeOut),
axisAlignment: 0.0,
child: Container(
margin: EdgeInsets.symmetric(vertical: 10.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
margin: EdgeInsets.only(right: 16.0),
child: CircleAvatar(
backgroundImage:
NetworkImage(snapshot.value['senderPhotoUrl'])),
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(snapshot.value['senderName'],
style: Theme.of(context).textTheme.subhead),
Container(
margin: EdgeInsets.only(top: 5.0),
child: Text(snapshot.value['text']),
),
],
),
),
],
),
));
}
}
的代码:FirebaseAnimatedList
答案 0 :(得分:3)
这是因为扑腾测试版使用Dart-2,默认情况下确保最大类型安全
解决错误1: 变化
}
要
(a, b) => b.key.compareTo(a.key)
解决错误2: 变化
从(Datasnapshot a, Datasnapshot b) => b.key.compareTo(a.key)
功能
int index
并在itemBuilder
函数中new
之后添加return
个关键字。
希望有所帮助!
答案 1 :(得分:0)
itemBuilder有一个名为index的额外参数。
typedef小部件FirebaseAnimatedListItemBuilder( BuildContext上下文, DataSnapshot快照, 动画动画 整数索引 );
因此,只需在“动画”之后添加“,_”即可解决该问题。