在我的应用中,StreamBuilder用于Firebase和提供程序用于连接。
背景:
我打开了互联网,streambuilder从firebase加载了5个列表的图像。现在,我关闭了互联网并向上滚动,图像未加载,并显示下一个列表的占位符图像。我认为这是正确的,因为streambuilder仅针对可见屏幕加载。由于Firebase中的图像不可用,因此占位符被视为ImageStream。
查询:
我想在打开互联网时使用图像更改/更新占位符。现在,来自firebase的快照是相同的,并且占位符被视为图像流,我在列表中看不到来自firebase的图像。
作为提供程序的Internet连接,我可以构建streambuilder,但是快照是相同的,我不知道如何更新。
答案 0 :(得分:0)
这是您提出的问题的可能解决方案。它使用侦听器代替了StreamBuilder
来访问列表,并通过使用connectivity package来侦听连接更改来重新建立Internet连接,从而重新监听了Stream
。由于您未提供任何代码,因此下面是一个示例:
进口
import 'dart:async';
import 'package:connectivity/connectivity.dart';
声明和方法
StreamSubscription subscription;
List<String> myStrings = [];
@override
void initState() {
subscription = new Connectivity().onConnectivityChanged.listen((
ConnectivityResult result) {
handleConnectivityChange(result);
}
);
listenToStringList();
super.initState();
}
@override
void dispose() {
subscription.cancel();
myStreamFromStateOrParentWidget.cancel();
super.dispose();
}
void listenToStringList(){
myStreamFromStateOrParentWidget.listen((snapshot){
setState(() {
myStrings = snapshot;
});
});
}
void handleConnectivityChange(connectionState){
debugPrint('connectionState: $connectionState');
switch(connectionState) {
case ConnectivityResult.none:
debugPrint('no connection');
break;
case ConnectivityResult.wifi:
listenToStringList();
break;
case ConnectivityResult.mobile:
listenToStringList();
break;
default:
debugPrint('default');
break;
}
}
小部件
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: ListView.builder(
itemCount: myStrings.length,
itemBuilder: (context, index){
return Text(myStrings[index]);
}
),
)
);
}