美文网首页
flutter 使用listview的 时候,来回滑动后最上面的

flutter 使用listview的 时候,来回滑动后最上面的

作者: 夏天爱西瓜汁 | 来源:发表于2020-09-29 18:47 被阅读0次

    问题描述:
    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,滑动后页面正常,没有出现上述问题

    原因:

    1. listview同ios中tableview,有复用机制,超出屏幕的部分内存会回收掉,而SingleChildScrollView没有复用机制,不会回收(如果页面内容比较多,用SingleChildScrollView会比较浪费内存,性能很差)

    2. 没有注意到的是StreamBuilder中的_viewModel.orderInfo是用的PublishSubject,PublishSubject只会获取一次数据,listview超出屏幕部分被回收后,再次滑动回来显示需要重新获取数据,此时将无法获取到数据,所以会出现上述问题。因此需要使用BehaviorSubject,它会 记录最新一次的事件,并在新的收听者收听的时候将记录下的事件作为第一帧发给收听者。可以多次获取数据

    不过可能也不完全是这个问题影响,因为别的超出屏幕的部分,再次划出来的时候数据没有变,,也找不到其他原因,暂且以这个答案记录

    相关文章

      网友评论

          本文标题:flutter 使用listview的 时候,来回滑动后最上面的

          本文链接:https://www.haomeiwen.com/subject/pfneuktx.html