基于Internet连接重建StreamBuilder

时间:2020-01-05 15:41:53

标签: flutter

在我的应用中,StreamBuilder用于Firebase和提供程序用于连接。

背景:

我打开了互联网,streambuilder从firebase加载了5个列表的图像。现在,我关闭了互联网并向上滚动,图像未加载,并显示下一个列表的占位符图像。我认为这是正确的,因为streambuilder仅针对可见屏幕加载。由于Firebase中的图像不可用,因此占位符被视为ImageStream。

查询:

我想在打开互联网时使用图像更改/更新占位符。现在,来自firebase的快照是相同的,并且占位符被视为图像流,我在列表中看不到来自firebase的图像。

作为提供程序的Internet连接,我可以构建streambuilder,但是快照是相同的,我不知道如何更新。

1 个答案:

答案 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]);
        }
      ),
    )
  );
}