问题描述:
child: ListView(
children: <Widget>[
Text(' 服务流程'),
_doctorFlow,
_detail,
],
),
Widget get _doctorFlow => StreamBuilder<BaseOrderInfo>(
stream: _viewModel.orderInfo,
final PublishSubject<BaseOrderInfo> _orderInfoController =
PublishSubject<BaseOrderInfo>();
_doctorFlow中也包含了listview
上滑时,如果_doctorFlow不在屏幕上,再下滑回到最顶端,_doctorFlow中数据就会变为默认数据(没有获取到网络数据时的默认数据)
图片.png
滑动到最下边
图片.png
返回滑回最顶端
图片.png
此时服务流程部分已不显示(录屏转成gif动图太大上传不了,图片凑合看😄)
不知道原因的时候尝试换成了SingleChildScrollView,滑动后页面正常,没有出现上述问题
原因:
-
listview同ios中tableview,有复用机制,超出屏幕的部分内存会回收掉,而SingleChildScrollView没有复用机制,不会回收(如果页面内容比较多,用SingleChildScrollView会比较浪费内存,性能很差)
-
没有注意到的是StreamBuilder中的_viewModel.orderInfo是用的PublishSubject,PublishSubject只会获取一次数据,listview超出屏幕部分被回收后,再次滑动回来显示需要重新获取数据,此时将无法获取到数据,所以会出现上述问题。因此需要使用BehaviorSubject,它会 记录最新一次的事件,并在新的收听者收听的时候将记录下的事件作为第一帧发给收听者。可以多次获取数据
不过可能也不完全是这个问题影响,因为别的超出屏幕的部分,再次划出来的时候数据没有变,,也找不到其他原因,暂且以这个答案记录
网友评论