【问题标题】:How to properly feed data to StreamBuilder initialData parameter?如何正确地将数据提供给 StreamBuilder 的 initialData 参数?
【发布时间】:2019-03-26 01:35:55
【问题描述】:

我正在使用 StreamBuilder 小部件来显示一些数据。最近打开应用程序时,我想显示我的 json 文件中的一些初始数据并将其提供给 StreamBuilder 的 initialData 可选关键字参数。

这是我喂它的方法:

MyStorage m = new MyStorage(); // Using path_provider, I accessed the json file inside this class
int x;

@override
void initState(){
    super.initState();
    getData();
}

getData() async{
    Map<String, dynamic> myMap = await m._getMap;
    x = int.parse(myMap["total"]);
}

...

@override
Widget build(BuildContext context){
    ...

    child: StreamBuilder(
        stream: mystream, // coming from my BLoC class
        initialData: x,
        builder: (context, snapshot){
            return new Text("${snapshot.data}");
        }
...

问题在于我的 StreamBuilder 中的 Text 小部件显示为“null”。

我试图将我的代码重写为:

MyStorage m = new MyStorage();

Future<int> getData() async{
    Map<String, dynamic> myMap = await m._getMap;
    return int.parse(myMap["total"]);
}

...

@override
Widget build(BuildContext context){
    ...

    child: StreamBuilder(
        stream: mystream, // coming from my BLoC class
        initialData: getData(),
        builder: (context, snapshot){
            return new Text("${snapshot.data}");
        }

...

但它在我的文本小部件上显示为“Future 实例:int”

我在 StreamBuilder 中的流参数没有问题。它显示了我对 BLoC 类的期望的正确值。

我遇到的唯一问题是从我的 json 文件中输入 initialData。

我做错了什么?我将不胜感激任何帮助。谢谢

[更新]

经过长时间思考解决方案后,我放弃了使用 initialData 参数,因为在我将 int 添加到 StreamBuilder 之后,就像这样 StreamBuilder&lt;int&gt;() 它提示我它只会采用整数值。我不能用 Future 或 Stream 来喂它,所以我决定不使用它。我所做的是通过 ConnectionState 在 StreamBuilder 中嵌套了一个 FutureBuilder。

这是我现在的代码:

MyStorage m = new MyStorage();

Future<int> getData() async{
    Map<String, dynamic> myMap = await m._getMap;
    return int.parse(myMap["total"]);
}

...

@override
Widget build(BuildContext context){
    ...

    child: StreamBuilder<int>(
        stream: mystream, // coming from my BLoC class
        //initialData: getData(),
        builder: (context, snapshot){
            swith(snapshot.connectionState){
                case ConnectionState.none:
                    return new FutureBuilder(
                        future: getData(),
                        builder: (context, snapshot){
                            return new Text('${snapshot.data}');
                        }
                    );
                case ConnectionState.active:
                case ConnectionState.waiting:
                    return new FutureBuilder(
                        future: getData(),
                        builder: (context, snapshot){
                            return new Text('${snapshot.data}');
                        }
                    );
                case ConnectionState.done:
                    if (snapshot.hasData){
                        return new Text('${snapshot.data}');
                    }
                    return new FutureBuilder(
                        future: getData(),
                        builder: (context, snapshot){
                            return new Text('${snapshot.data}');
                        }
                    );
            }
        }

...

我知道这个解决方案效率很低,但目前我想不出更好的解决方案。

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    initialData 应该是在您的实际数据可用之前要显示的数据。

    0 作为初始数据。

    StreamBuilder 有一个附加参数stream 负责获取您的流数据。在这里你可以做stream: getData().asStream,

    编辑:

    还要确保在 StreamBuilder 中指定您期望的数据类型。 StreamBuilder&lt;int&gt;()

    【讨论】:

    • 是的,我已经将流参数设置为其他参数,它从我的 BLoC 类中侦听。我的流参数没有问题。我无法将我的 initialData 设置为 0,因为我想显示我的 json 文件中的值(整数)。每次我向我的 BLoC 类添加一个整数时,我的 json 文件也会更新,这样当用户离开/关闭应用程序时,当用户再次打开它时,它将显示 json 文件中的更新值。很抱歉,我没有在帖子中显示流参数。我会编辑它。
    • 那么流在监听什么? initialData 的目的是在等待流发出数据时有点像占位符。所以数据应该立即存在。在您的情况下,您正在尝试从异步函数中获取数据(这是异步的,意味着它属于 bloc),在我看来,应该将逻辑移入 bloc 并从中流式传输。每当您更新这些参数时,只需更新此流
    • 我的流监听一个整数。是的,我使用了异步函数。
    猜你喜欢
    • 1970-01-01
    • 2013-08-22
    • 2016-10-23
    • 1970-01-01
    • 2016-01-08
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    相关资源
    最近更新 更多