Flutter 初始化ListView定位子組件位置

一、概述

在開發(fā)過程中,我遇到了一個問題:PDF閱讀,橫屏切換為豎屏時,需要定位到橫屏當前閱讀的頁碼,而在豎屏頁使用了LIstView滑動組件,所以初始化顯示時就需要定位到當前閱讀頁碼。

二、原理

根據(jù)橫屏頁面的頁碼,確定LIstView的初始滑動偏移量,然后使用定位方法_offsetController.position.moveTo(double)定位至這個值即可。

三、實現(xiàn)

首先需要獲取滑動偏移量

  ScrollController _offsetController= ScrollController(); //定義ListView的controller
  var oldOffset; //定義初始滑動偏移量
if(!mounted) return;
                      setState(() {
                        _isVertical = !_isVertical;
                        oldOffset=(_pageNumber-1)*(screenHeight-90.px); //獲取滑動偏移量
                        //在頁面生命周期build結束之后,回調此方法進行定位
                        WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
                          _offsetController.position.moveTo(oldOffset);
                        });
                      });

完成了橫屏至豎屏的跳轉,接著就是完成豎屏至橫屏的跳轉,也是根據(jù)滑動偏移量進行處理:

 @override
  void initState(){
    super.initState();
    //添加滑動監(jiān)聽
    _offsetController.addListener(() {
   //向下滑動超過一個頁面的長度則_pageNumberr+1,反之減一
      if((_offsetController.offset-oldOffset)>=(screenHeight-90.px)){
       setState(() {
         oldOffset=_offsetController.offset.toInt();
         _pageNumber++;
       });
      }else if((oldOffset-_offsetController.offset)>=(screenHeight-90.px)){
        setState(() {
          oldOffset=_offsetController.offset.toInt();
          _pageNumber--;
        });
      }
    });
  }

或者更簡單

  @override
  void initState() {
    super.initState();
    _controller.addListener(_calcOffsetPosition);
  }
  _calcOffsetPosition() {
    _currentIndex = _controller.offset ~/ (screenHeight - 90.px);
  }

至此,就完成了LIstView的定位,實現(xiàn)橫豎屏切換PDF閱讀的功能。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容