一痹扇、概述
在開發(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結(jié)束之后,回調(diào)此方法進行定位
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
_offsetController.position.moveTo(oldOffset);
});
});
完成了橫屏至豎屏的跳轉(zhuǎn)煌妈,接著就是完成豎屏至橫屏的跳轉(zhuǎn),也是根據(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閱讀的功能仇冯。