我正在使用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参数,因为像这样int
向StreamBuilder
添加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
我知道这种解决方案效率很低,但是到目前为止我还没有想到更好的解决方案。
答案 0 :(得分:0)
initialData应该是在实际数据可用之前显示的数据。
将0
放置为initialData。
StreamBuilder具有一个附加参数stream
,该参数负责获取您的流数据。在这里您可以stream: getData().asStream,
编辑:
还要确保在StreamBuilder中指定所需的数据类型。 StreamBuilder<int>()