最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Flutter 快速實(shí)現(xiàn)聊天會(huì)話列表效果示例詳解

 更新時(shí)間:2022年10月09日 09:35:30   作者:LinXunFeng  
這篇文章主要為大家介紹了Flutter 快速實(shí)現(xiàn)聊天會(huì)話列表效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、目標(biāo)效果

聊天會(huì)話頁的列表效果

  • 1、聊天數(shù)據(jù)不滿一屏?xí)r,頂部顯示所有聊天數(shù)據(jù)
  • 2、插入消息時(shí)
    • 如果最新消息緊靠列表底部時(shí),則插入消息會(huì)使列表向上推
    • 如果不是緊靠列表底部,則固定到當(dāng)前聊天位置

效果如圖所示:

二、原理

1、 涉及的方法

ScrollPhysics 提供了 adjustPositionForNewDimensions 方法,用于修正 ScrollViewrebuild 后的偏移量,方法聲明如下

double adjustPositionForNewDimensions({
  required ScrollMetrics oldPosition,
  required ScrollMetrics newPosition,
  required bool isScrolling,
  required double velocity,
})

默認(rèn)情況下,值為上一次的偏移量,即 newPosition 參數(shù)的 pixels,所以在頂部插入消息時(shí),消息列表就會(huì)跟隨滾動(dòng)。

如下圖所示,觀察藍(lán)色的消息條目,每播入一條消息時(shí),所有消息會(huì)自動(dòng)往上頂,而滾動(dòng)視圖的偏移量其實(shí)一直是沒有變化的~

注:值得注意的是,如果該方法返回的值與 newPositionpixels 不相等時(shí),則會(huì)觸發(fā)視圖的重新布局,所以這個(gè)操作還是比較昂貴的,應(yīng)盡量減少返回值的變動(dòng)。

2、實(shí)現(xiàn)邏輯

根據(jù)上述內(nèi)容我們不難推出插入消息時(shí)的效果實(shí)現(xiàn)原理如下:

效果返回的值
消息緊靠列表底部時(shí),插入消息會(huì)使列表向上推直接返回 super 的值,即 newPosition 參數(shù)的 pixels
如果不是緊靠列表底部,則固定到當(dāng)前聊天位置返回原本第 0 條消息的最新偏移量

下面重點(diǎn)說明一下第 2 點(diǎn)中 返回原本第0條消息的最新偏移量 的實(shí)現(xiàn)邏輯:

ListView 的本質(zhì)是 RenderSliverList,通過 RenderSliverListfirstChild 屬性拿到當(dāng)前列表中渲染的首個(gè) item。

如下圖,firstChild 是下標(biāo)為 10item,這個(gè) item 與預(yù)渲染區(qū)域 cacheExtent 相關(guān),如果將其設(shè)置為 0,則 firstChild 的下標(biāo)將會(huì)是 12,這個(gè)相信不難理解。

所以,我們只需要在插入消息時(shí),記錄第 0 條消息的偏移量,當(dāng)列表視圖 rebuild 后,adjustPositionForNewDimensions 方法會(huì)被調(diào)用,此時(shí)取出第 1 條消息的偏移量,兩者的差值加上 super 的值即為目標(biāo)修正偏移量。

至于 聊天數(shù)據(jù)不滿一屏?xí)r,頂部顯示所有聊天數(shù)據(jù) 這個(gè)效果只是在切換 shrinkWrap 而已,比較簡單就不在此展開講了。

我已將上述邏輯進(jìn)行了封裝,集成于 flutter_scrollview_observer,接下來我們就來看看如何使用。

三、使用

現(xiàn)在只需三個(gè)步驟即可快速實(shí)現(xiàn)聊天會(huì)話列表的效果

步驟一:初始化必要的 ListObserverControllerChatScrollObserver

/// 初始化 ListObserverController
observerController = ListObserverController(controller: scrollController)
  ..cacheJumpIndexOffset = false;
/// 初始化 ChatScrollObserver
chatObserver = ChatScrollObserver(observerController)
  ..toRebuildScrollViewCallback = () {
    // 這里可以重建指定的滾動(dòng)視圖即可
    setState(() {});
  };

步驟二:按如下配置 ListView 并使用 ListViewObserver 將其包裹

Widget _buildListView() {
  Widget resultWidget = ListView.builder(
    physics: ChatObserverClampinScrollPhysics(observer: chatObserver),
    shrinkWrap: chatObserver.isShrinkWrap,
    reverse: true,
    controller: scrollController,
    ...
  );
  resultWidget = ListViewObserver(
    controller: observerController,
    child: resultWidget,
  );
  return resultWidget;
}

步驟三:插入或刪除消息前,調(diào)用 ChatScrollObserverstandby 方法

onPressed: () {
  chatObserver.standby();
  setState(() {
    chatModels.insert(0, ChatDataHelper.createChatModel());
  });
},
...
onRemove: () {
  chatObserver.standby(isRemove: true);
  setState(() {
    chatModels.removeAt(index);
  });
},

注:示例中的 setState 都可以換成對列表視圖進(jìn)行局部刷新的代碼

四、最后

GitHub地址: flutter_scrollview_observer

該庫還實(shí)現(xiàn)了其它十分實(shí)用的功能,相關(guān)功能有對應(yīng)的文章進(jìn)行敘述

以上就是Flutter 快速實(shí)現(xiàn)聊天會(huì)話列表效果示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Flutter 聊天會(huì)話列表的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

南靖县| 凤凰县| 玉环县| 门源| 富裕县| 肇州县| 娄烦县| 连云港市| 乐昌市| 湖口县| 文安县| 榆林市| 高州市| 绥中县| 合水县| 安庆市| 元阳县| 开原市| 稻城县| 高安市| 友谊县| 大余县| 宝应县| 古蔺县| 鄂托克前旗| 娄底市| 岗巴县| 东山县| 兴和县| 樟树市| 山东| 沙河市| 万全县| 瓦房店市| 友谊县| 中江县| 三门县| 靖边县| 庐江县| 南陵县| 富顺县|