Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
颤振:StreamBuilder中的项目(使用firebase实时数据库)是随机排序的_Firebase_Flutter_Firebase Realtime Database_Dart_Stream Builder - Fatal编程技术网

颤振:StreamBuilder中的项目(使用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(

我正在使用Firebase实时数据库创建一个简单的应用程序,用户在其中输入文本并将其添加到聊天列表中

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来完成其余的工作