小编ton*_*nik的帖子

Flutter 如何刷新 StreamBuilder?

考虑以下代码:

StreamBuilder<QuerySnapshot> _createDataStream(){   
    return StreamBuilder<QuerySnapshot>(
          stream: Firestore.instance.collection("data").limit.(_myLimit).snapshots(),
          builder: (context, snapshot){
              return Text(_myLimit.toString);   
            }
        );
}
Run Code Online (Sandbox Code Playgroud)

我希望 StreamBuilder 在_myLimit变量更改时刷新。可以这样做:

void _incrementLimit(){
    setState(() =>_myLimit++);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是是否有另一种更快的方法,除了那个setState((){});。因为我不想build()在_myLimitVariable 更改时回忆整个方法。

我想出了另一种方式,但我觉得有一个更好的解决方案,因为我认为我没有使用该.periodic功能,而且我得到了一个嵌套的 Stream 我不确定这有多常见:

Stream<int> myStream = Stream.periodic(Duration(), (_) => _myLimit);
...
@override
Widget build(BuildContext context){
...
return StreamBuilder<int>(
                    stream: myStream,
                    builder: (context, snapshot){
                      return _createDataStream;
                    },
                  ),
...
}
Run Code Online (Sandbox Code Playgroud)

解决方案

import 'dart:async';
import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatefulWidget {
  @override …
Run Code Online (Sandbox Code Playgroud)

onchange stream listener dart flutter

6
推荐指数
1
解决办法
1万
查看次数

Flutter Cloud Firestore 将 serverTimestamp 转换为 String

我的flutter应用程序需要获取当前时间,我已经为此尝试了几个包:truetime、ntptime、dart中的Datetime、cloud firestore中的Timestamp.now,当在手机设置中切换时区时,它们都返回了不同的时间。它为所有时区的所有设备返回相同时间的唯一方法是 FieldValue.serverTimestamp() 方法,我将此值保存到 firestore 文档中,并在那里将其识别为时间戳类型的字段。

我想把它转换成一个字符串,这样我就得到一个这样的字符串:“年-月-日小时:分钟:秒”

我试过的:

(1)

final now = FieldValue.serverTimestamp();
Run Code Online (Sandbox Code Playgroud)

将此变量保存到文档中 ... ,文档字段如下所示:

时间戳:Day.Month Year at Hours:Minutes:Seconds UTC+2(时间戳)

然后我从字段“时间戳”中获取此值并将其分配给文本小部件:

Text(doc.data["timestamp"].toString())
Run Code Online (Sandbox Code Playgroud)

文本小部件如下所示:

时间戳(秒=1568560057,纳秒=790000000)

它应该是什么样子(如前所述):

“年月日时:分:秒”

(2)

final now = FieldValue.serverTimestamp().toString();
Run Code Online (Sandbox Code Playgroud)

将此变量保存到文档中 ... ,文档字段如下所示:

时间戳:“'FieldValue' 的实例”(字符串)

然后我从字段“时间戳”中获取此值并将其分配给文本小部件:

Text(doc.data["timestamp"].toString())
Run Code Online (Sandbox Code Playgroud)

文本小部件如下所示:

'FieldValue' 的实例

它应该是什么样子(如前所述):

“年月日时:分:秒”


所以任何人都知道我如何获得我需要的字符串格式,或者可能是另一种方法,它为所有设备和时区返回相同的时间,并且可以转换为我需要的格式的字符串?

提前致谢!


解决方案:感谢Frank和CopsOnRoad

我们必须将此值保存到文档字段中:

final now = FieldValue.serverTimestamp();
Run Code Online (Sandbox Code Playgroud)

这将在文档字段中保存为 Timestamp 对象。

现在我们需要将其转换为 DateTime 对象,以便在 Text Widget 中使用它,然后将其转换为 String 以获取格式:

Text(doc.data["timestamp"].toDate().toString())
Run Code Online (Sandbox Code Playgroud)

文本小部件如下所示:

年-月-日 小时:分钟:秒

解决了。

timestamp firebase flutter google-cloud-firestore

3
推荐指数
1
解决办法
2823
查看次数