首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >侦听启动ScrollController on CustomScrollView

侦听启动ScrollController on CustomScrollView
EN

Stack Overflow用户
提问于 2020-04-13 13:44:26
回答 1查看 944关注 0票数 2

在我的项目中,我有一个项目,如果屏幕一直向上滚动,我只想设置action button的可见性。

我现在拥有的代码工作得很好,但是一旦屏幕开始滚动,它就会触发代码--这确实不是我想要的。

那我该怎么解决呢?

以下是我的按需代码

代码语言:javascript
复制
class AccountPage extends StatefulWidget with NavigationStates {
  @override
  _AccountPage createState() => _AccountPage();
}

class _AccountPage extends State<AccountPage> {
  String searchQuery = '';
  ScrollController _controller;

  bool sliverActionsHidden = true;

  // Tracking search query.
  void _updateSearchQuery(String query) {
    setState(
      () {
        searchQuery = query;
      },
    );
  }

  // Listening for user scroll on screen.
  void _scrollListener() {
    if (_controller.offset <= _controller.position.minScrollExtent &&
        !_controller.position.outOfRange) {
      setState(() {
        sliverActionsHidden = false;
        print('Reach the top');
      });
    }
    else {
      setState(() {
        sliverActionsHidden = true;
        print('Reach the bottom');
      });
    }
  }

  @override
  void initState() {
    _controller = ScrollController();
    _controller.addListener(_scrollListener);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    /* Action IconButtons ----------------------------------------------- */
    final actionButtons = <Widget>[
      IconButton(
        icon: Icon(Icons.filter_list),
        onPressed: () {
          print('Filter');
        },
      ),
      IconButton(
        icon: Icon(Icons.more_vert),
        onPressed: () {
          print('More Settings');
        },
      ),
    ];

    /* Material Appbar ----------------------------------------------- */
    final PreferredSizeWidget appBar = SearchBar(
      canSearch: true,
      query: searchQuery,
      searchQuery: (value) {
        _updateSearchQuery(value);
        print("Listening for search query : $value");
      },
      // Action Icons
      actions: actionButtons,
    );

    /* Sliver Appbar ----------------------------------------------- */
    final sliverAppBar = SliverAppBar(
      pinned: true,
      expandedHeight: MediaQuery.of(context).size.height * 0.2,
      backgroundColor: Theme.of(context).primaryColor,
      flexibleSpace: FlexibleSpaceBar(
        // Searchbar
        background: Column(
          children: <Widget>[
            appBar,
          ],
        ),
        // Page Title
        title: Text(
          AppStrings.accountTitle,
          style: Theme.of(context).textTheme.title.copyWith(
                color: CustomColors().novaWhite,
              ),
        ),
      ),
      // Action Buttons
      actions: sliverActionsHidden ? actionButtons : <Widget>[],
    );

    /* Page Content ----------------------------------------------- */
    final bodyContent = SafeArea(
      bottom: false,
      child: CustomScrollView(
        controller: _controller,
        slivers: <Widget>[
          sliverAppBar,
          SliverToBoxAdapter(
            child: Container(
              height: MediaQuery.of(context).size.height,
              padding: EdgeInsets.all(Constants.paddingXY_32),
              decoration: BoxDecoration(
                color: Theme.of(context).scaffoldBackgroundColor,
              ),
              // Page content begins here...
              child: Text(searchQuery.toString()),
            ),
          ),
        ],
      ),
    );

    /* Scaffold ----------------------------------------------- */
    return Scaffold(
      body: bodyContent,
      backgroundColor: Theme.of(context).primaryColor,
    );
  }
}
EN

回答 1

Stack Overflow用户

发布于 2020-04-13 19:18:15

您可以检查是否达到滚动位置的maxScrollExtent值:

代码语言:javascript
复制
void _scrollListener() {
  if (_controller.offset == _controller.position.maxScrollExtent) {
    setState(() {
      sliverActionsHidden = true;
      print('Reach the top');
    });
  } else {
    setState(() {
      sliverActionsHidden = false;
      print('Reach the bottom');
    });
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61189239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档