【问题标题】:How to expand SliverAppBar programmatically如何以编程方式扩展 SliverAppBar
【发布时间】:2019-11-18 03:58:03
【问题描述】:

我有一个 SliverAppBar,它向上滚动缩小,向下滚动展开。

我想在切换BottomNavigationBar时展开SliverAppBar。

当前情况下,SliverAppBar保持切换前的状态。

这是我的代码。 https://gist.github.com/ysknsn/d90a84a180e32de5b0691de874c65d55

任何建议都是有帮助的。 谢谢。

【问题讨论】:

    标签: flutter dart flutter-sliver


    【解决方案1】:

    只需对 TabController 执行相同操作...

    把它放在一个局部变量中:

      TabController _tabController;
      ScrollController _scrollController;
    
      int _selectedIndex = 0;
    
      @override
      void initState() {
        _tabController = TabController(vsync: this, length: 2);
        _scrollController = ScrollController(keepScrollOffset: true);
        super.initState();
      }
    

    然后在你的 NestedScrollView 中使用它`

      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: DefaultTabController(
    
            length: _tabController.length,
            child: NestedScrollView(
              controller: _scrollController,
              key: PageStorageKey(widget.title),
              ...
    

    然后点击时更新位置:

      void _onItemTapped(int index) {
        _scrollController.jumpTo(0);
        setState(() {
          _selectedIndex = index;
          _tabController.index = index;
        });
      }
    

    【讨论】:

    • 对不起,我不能使用jumpTo(0),因为使用 PageStorageKey 来存储滚动位置。
    • @ysknsn 这很尴尬。我刚刚使用了您的代码并进行了我写的更改...我对其进行了测试并取得了预期的效果(我的代码也具有 PageStorageKey)。您是否收到任何错误消息?
    • 感谢您的测试。很抱歉没有解释。没有错误,但无法保持滚动位置。向下滚动左侧选项卡到Left: 100,切换到右侧选项卡,然后切换到左侧选项卡。在这种状态下,我希望它保持为Left: 100,但结果为Left: 0
    • 因此您需要在代码中进行一些重构。您只有一个 ScrollView 在两个选项卡之间共享(这些选项卡是 scrollView 的子级)。您需要为每个选项卡滚动一个。每个人都有一个控制器。
    • 在使用NestedScrollView 时,似乎不能将ScrollController 设置为子ScrollView。由于这次实现似乎很困难,我决定放弃。感谢您的帮助。
    【解决方案2】:

    将滚动控制器添加到您的“自定义滚动视图”

    ScrollController _scrollController;
    
    Widget build(BuildContext context) {
    _scrollController = ScrollController();
    return Scaffold(
    body: CustomScrollView( shrinkWrap: true, controller: _scrollController,
    physics: BouncingScrollPhysics(),
    slivers: <Widget>[
    SliverAppBar(
    pinned: false,
    :
    :
    :
    :
    :
    :
    :
    :
    :
    onPressed: () {// Scroll to top when on click => Expand 
    _scrollController.animateTo(
    _scrollController.position.minScrollExtent,
    duration:Duration(milliseconds:1300),
    curve: Curves.decelerate,);
     },
    
    onPressed: () {// Scroll to bottom when on click => Collapse
    scrollController.animateTo(
        scrollController.position.maxScrollExtent,
        duration: Duration(milliseconds: 1300),
        curve: Curves.decelerate,
      );
     },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2012-04-30
      • 2023-04-06
      • 2020-07-29
      相关资源
      最近更新 更多