[Flutter-25] ScrollController 監聽滾動一


ScrollController

/* 監聽滾動的事件

對於滾動的視圖我們需要監聽它的一些滾動事件、在監聽到的時候去做一些操作。
- 比如滾動到底部、我們希望可以做下拉刷新更多
- 比如滾動到一定位置時顯示一個回到頂部的按鈕、點擊回到頂部的按鈕、回到頂部。
- 比如監聽滾動什么時候開始、什么時候結束。

在flutter中監聽滾動相關的內容由兩部分組成: ScrollController & ScrollNotification


一:ScrollController

> 在flutter中、WIdget並不是最終渲染到屏幕上的元素(真正渲染的是RenderObject), 因此通常這種監聽事件以及相關的
信息並不能直接從Widget中獲取、而是通過對應Widget的Controller來實現。

> ListView、GridView的組件控制器是ScrollController,我們可以通過它來獲取視圖的滾動信息,
並且可以調用里面的方法來更新視圖的滾動位置。

> 另外,通常情況下,我們會根據滾動的位置來改變一些Widget的狀態信息,
所以ScrollController通常會和StatefulWidget一起來使用,並且會在其中控制它的初始化、監聽、銷毀等事件。

需求:
    我們來做一個案例,當滾動到1000位置的時候,顯示一個回到頂部的按鈕:
    jumpTo(double offset): 沒有動畫
    animateTo(double offset,...):有動畫
    都是用於跳轉到指定的位置,它們不同之處在於,后者在跳轉時會執行一個動畫,而前者不會。

    ScrollController間接繼承自Listenable, 我們可以根據ScrollController 來監聽滾動事件。
*/
class Content1 extends StatefulWidget {
  @override
  _Content1State createState() => _Content1State();
}

class _Content1State extends State<Content1> {
  ScrollController _scrollController = ScrollController();
  bool _isScrollTop = false;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    // 初始化ScrollController

    // 監聽滾動
    _scrollController.addListener(() {
      print('_scrollController.addListener: ${_scrollController.offset}');
      var temp = _scrollController.offset >= 1000;
      if (temp != _isScrollTop) {
        setState(() {
          _isScrollTop = temp;
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ScrollController'),
      ),
      body: ListView.builder(
        itemBuilder: (BuildContext context, int index) {
          return ListTile(
            title: Text('item$index'),
          );
        },
        itemCount: 100, // 最大的數量
        itemExtent: 60, // 每條的高度
        controller: _scrollController, // 監聽的控制器
      ),
      floatingActionButton: !_isScrollTop
          ? null
          : FloatingActionButton(
              child: Icon(Icons.arrow_upward),
              onPressed: () {
                print('click-FloatingActionButton');
                //_scrollController.jumpTo(0);
                _scrollController.animateTo(0,
                    duration: Duration(milliseconds: 1000), curve: Curves.ease);
              },
            ),
    );
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM