問題描述:
child: ListView(
children: <Widget>[
Text(' 服務(wù)流程'),
_doctorFlow,
_detail,
],
),
Widget get _doctorFlow => StreamBuilder<BaseOrderInfo>(
stream: _viewModel.orderInfo,
final PublishSubject<BaseOrderInfo> _orderInfoController =
PublishSubject<BaseOrderInfo>();
_doctorFlow中也包含了listview
上滑時,如果_doctorFlow不在屏幕上,再下滑回到最頂端,_doctorFlow中數(shù)據(jù)就會變?yōu)槟J數(shù)據(jù)(沒有獲取到網(wǎng)絡(luò)數(shù)據(jù)時的默認數(shù)據(jù))
滑動到最下邊
返回滑回最頂端
此時服務(wù)流程部分已不顯示(錄屏轉(zhuǎn)成gif動圖太大上傳不了勋锤,圖片湊合看??)
不知道原因的時候嘗試換成了SingleChildScrollView,滑動后頁面正常侥祭,沒有出現(xiàn)上述問題
原因:
listview同ios中tableview叁执,有復(fù)用機制茄厘,超出屏幕的部分內(nèi)存會回收掉,而SingleChildScrollView沒有復(fù)用機制徒恋,不會回收(如果頁面內(nèi)容比較多蚕断,用SingleChildScrollView會比較浪費內(nèi)存欢伏,性能很差)
沒有注意到的是StreamBuilder中的_viewModel.orderInfo是用的PublishSubject入挣,PublishSubject只會獲取一次數(shù)據(jù),listview超出屏幕部分被回收后硝拧,再次滑動回來顯示需要重新獲取數(shù)據(jù)径筏,此時將無法獲取到數(shù)據(jù),所以會出現(xiàn)上述問題障陶。因此需要使用BehaviorSubject滋恬,它會 記錄最新一次的事件,并在新的收聽者收聽的時候?qū)⒂涗浵碌氖录鳛榈谝粠l(fā)給收聽者抱究』致龋可以多次獲取數(shù)據(jù)
不過可能也不完全是這個問題影響,因為別的超出屏幕的部分鼓寺,再次劃出來的時候數(shù)據(jù)沒有變勋拟,,也找不到其他原因妈候,暫且以這個答案記錄