如何正确地将数据提供给StreamBuilder initialData参数?

时间:2018-10-22 02:01:38

标签: dart flutter

我正在使用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中的“文本”窗口小部件显示为“空”。

我试图将代码重写为此:

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}");
        }

...

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

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

我唯一的问题是从json文件中获取initialData。

我在做什么错?我将不胜感激。谢谢

[更新]

经过长时间的思考,我放弃了使用initialData参数,因为像这样intStreamBuilder添加StreamBuilder<int>()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}'); } ); } } ... 之后,它提示我将只取一个值整数我无法将其与Future或Stream类型一起使用,因此我决定不使用它。我所做的是通过ConnectionState将FutureBuilder嵌套在StreamBuilder中。

这是我现在的代码:

df['TaxStatus'] = df.Public == 1

我知道这种解决方案效率很低,但是到目前为止我还没有想到更好的解决方案。

1 个答案:

答案 0 :(得分:0)

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

0放置为initialData。

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

编辑:

还要确保在StreamBuilder中指定所需的数据类型。 StreamBuilder<int>()