颤振:StreamBuilder中的项目(使用firebase实时数据库)是随机排序的
我正在使用Firebase实时数据库创建一个简单的应用程序,用户在其中输入文本并将其添加到聊天列表中颤振:StreamBuilder中的项目(使用firebase实时数据库)是随机排序的,firebase,flutter,firebase-realtime-database,dart,stream-builder,Firebase,Flutter,Firebase Realtime Database,Dart,Stream Builder,我正在使用Firebase实时数据库创建一个简单的应用程序,用户在其中输入文本并将其添加到聊天列表中 void main() => runApp(MyApp()); class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp(
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.indigo,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
var _firebaseRef = FirebaseDatabase().reference().child('chats');
TextEditingController _txtCtrl = TextEditingController();
@override
Widget build(BuildContext context) {
var comments = _firebaseRef.orderByChild('time').limitToLast(10);
return Scaffold(
body: Container(
child: SafeArea(
child: Column(
children: <Widget>[
Container(
child: Row(children: <Widget>[
Expanded(child: TextField(controller: _txtCtrl)),
SizedBox(
width: 80,
child: OutlineButton(
child: Text("Add"),
onPressed: () {
sendMessage();
}))
])),
StreamBuilder(
stream: comments.onValue,
builder: (context, snap) {
if (snap.hasData &&
!snap.hasError &&
snap.data.snapshot.value != null) {
Map data = snap.data.snapshot.value;
List item = [];
data.forEach(
(index, data) => item.add({"key": index, ...data}));
return Expanded(
child: ListView.builder(
itemCount: item.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(item[index]['message']),
);
},
),
);
} else
return Center(child: Text("No data"));
},
),
],
),
),
),
);
}
sendMessage() {
_firebaseRef.push().set({
"message": _txtCtrl.text,
'time': DateTime.now().millisecondsSinceEpoch
});
}
}
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
原色样本:颜色。靛蓝,
),
主页:MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
var_firebaseRef=FirebaseDatabase().reference().child('chats');
TextEditingController_txtCtrl=TextEditingController();
@凌驾
小部件构建(构建上下文){
var comments=_firebaseRef.orderByChild('time').limitToLast(10);
返回脚手架(
主体:容器(
儿童:安全区(
子:列(
儿童:[
容器(
子对象:行(子对象:[
已展开(子项:TextField(控制器:_txtCtrl)),
大小盒子(
宽度:80,
孩子:大纲按钮(
子项:文本(“添加”),
已按下:(){
sendMessage();
}))
])),
StreamBuilder(
流:comments.onValue,
生成器:(上下文,捕捉){
如果(snap.hasData&&
!snap.hasError&&
snap.data.snapshot.value!=null){
映射数据=snap.data.snapshot.value;
列表项=[];
data.forEach(
(索引,数据)=>item.add({“key”:索引,…数据});
扩大回报(
子项:ListView.builder(
itemCount:item.length,
itemBuilder:(上下文,索引){
返回列表块(
标题:文本(项目[索引][“消息]),
);
},
),
);
}否则
返回中心(子项:文本(“无数据”));
},
),
],
),
),
),
);
}
sendMessage(){
_firebaseRef.push().set({
“消息”:\u txtCtrl.text,
“时间”:DateTime.now().millissecondssinceepoch
});
}
}
它完美地存储和检索数据。但是,当我尝试添加数据时,新项目会被放置在列表中的随机点上
例如,在下图中,我放入列表的最后一项是“九”。但它被放在了列表的中心:
我尝试过按时间戳对列表进行排序,但没有任何效果
是什么导致了这个问题?我如何修复它?这可能会起作用:
使用查询
Query comments = _firebaseRef.orderByChild('time').limitToLast(10);
调用
snap.data.snapshot.value时代码>快照中的数据(已排序)将转换为未排序的映射。要维持秩序,您需要收听onChild…
请注意,FlatterFire有一个方便的工具,可以为您处理onChild…
的大部分重物
另见:
您的排序方式是什么?\u firebaseRef.orderByChild('time')。limitToLast(10);时间的类型是什么,我可以看到一个值样本吗?添加打印(snap.data.snapshot.value)代码>之前地图数据=snap.data.snapshot.value代码>点击添加后,告诉我们根据每次添加得到的输出:time1=1587847259193,time2=15878477282380仍然相同:(啊,该死。我有空时会搜索它:)。祝你好运man@WilsonOWilson当我尝试它时,我会得到一张排列完美的地图列表。但是当我删除onchildaded()函数时,它什么也不做。我想问题在于我的StreamBuilder为了解决我的问题,我可以使用该方法创建一个数据列表,然后使用listview builder来完成其余的工作