Flutter SliverAppbar в заголовке NestedScrollView не растягивается и не масштабируется так, как растягивается в CustomScrollView - PullRequest
0 голосов
/ 16 февраля 2020

SliverAppbar будет растягиваться и масштабироваться, если он находится в customScrollView, но не, когда он находится в NestedScrollView. Только тело NestedScrollView имеет BouncingScrollPhysics, как заголовок NestedScrollView также может иметь BouncingScrollPhysics, чтобы он мог растягивать и масштабировать SliverAppBar.

Однако, если я добавлю scrollController в body / inner scrollView, тогда заголовок SliverApp растягивается, но затем они становятся двумя отдельными видами прокрутки, и заголовок не прокручивается вверх при прокрутке тела. Проверьте Запись экрана

      @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: DefaultTabController(
        length: 3,
        child: NestedScrollView(
          physics: BouncingScrollPhysics(),
          controller: mainScroller,
          headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
            return <Widget>[
              SliverAppBar(
                stretch: true,
                pinned: true,
                floating: false,
                elevation: 0,
                onStretchTrigger: () {
                  print('stretch');
                  return;
                },
                title: isFlexibleSpaceVisible ? null : Text(widget.name),
                expandedHeight: containerHeight - kToolbarHeight,
                flexibleSpace: FlexibleSpaceBar(
                  stretchModes: <StretchMode>[
                    StretchMode.zoomBackground,
                    StretchMode.blurBackground,
                  ],
                  collapseMode: CollapseMode.pin,
                  background: Container(
                    color: Theme.of(context).canvasColor,
                    child: Stack(
                      children: <Widget>[
                        Container(
                          height: headerImageHeight,
                          width: double.infinity,
                          decoration: BoxDecoration(
                            color: kBackgroundColor,
                            image: DecorationImage(
                              fit: BoxFit.cover,
                              colorFilter: ColorFilter.mode(
                                Colors.black54,
                                BlendMode.darken,
                              ),
                              image: NetworkImage(
                                  'https://picsum.photos/seed/${Random().nextInt(100)}/${MediaQuery.of(context).size.width.toInt()}'),
                            ),
                          ),
                        ),
                        Container(
                          height: headerSpace,
                          margin: EdgeInsets.only(
                              top: headerImageHeight - bringImageUpMargin),
                          padding: EdgeInsets.only(left: 8, right: 8),
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            crossAxisAlignment: CrossAxisAlignment.center,
                            children: <Widget>[
                              Container(
                                decoration: BoxDecoration(
                                    color: Theme.of(context).canvasColor,
                                    shape: BoxShape.circle),
                                padding: EdgeInsets.all(6),
                                child: CircleAvatar(
                                  backgroundColor: kCardColor,
                                  backgroundImage: NetworkImage(
                                      'https://picsum.photos/seed/${Random().nextInt(100)}/200'),
                                  radius: profileImageRadius,
                                ),
                              ),
                              Expanded(
                                child: Container(
                                  margin: EdgeInsets.symmetric(
                                      horizontal: 4, vertical: 12),
                                  child: Column(
                                    mainAxisAlignment: MainAxisAlignment.end,
                                    crossAxisAlignment:
                                        CrossAxisAlignment.stretch,
                                    children: <Widget>[
                                      Text(
                                        widget.name,
                                        style: TextStyle(
                                            fontSize: 16,
                                            fontWeight: FontWeight.w700),
                                      ),
                                      SizedBox(height: 2),
                                      Wrap(
                                        alignment: WrapAlignment.spaceBetween,
                                        children: <Widget>[
                                          Container(
                                            padding: EdgeInsets.symmetric(
                                                horizontal: 6, vertical: 2),
                                            decoration: BoxDecoration(
                                                color: kPrimaryColor,
                                                borderRadius:
                                                    BorderRadius.circular(4)),
                                            child: Text(
                                              widget.skill,
                                              style: TextStyle(
                                                  fontSize: 12,
                                                  color: Colors.white),
                                            ),
                                          ),
                                          Container(
                                            padding: EdgeInsets.symmetric(
                                                vertical: 2, horizontal: 6),
                                            decoration: BoxDecoration(
                                                color: kCardColor,
                                                borderRadius:
                                                    BorderRadius.circular(4)),
                                            child: Text(
                                              '\$${widget.rate} / ${widget.per}',
                                              style: TextStyle(
                                                  color: kPrimaryColor,
                                                  fontSize: 12),
                                            ),
                                          ),
                                        ],
                                      ),
                                    ],
                                  ),
                                ),
                              )
                            ],
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
              ),
              SliverToBoxAdapter(
                child: Container(
                  padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
                  child: Column(
                    children: <Widget>[
                      Row(
                        children: <Widget>[
                          Container(
                              width: 22,
                              height: 18,
                              decoration: BoxDecoration(
                                borderRadius: BorderRadius.circular(4),
                                color: kSecondaryColor,
                              ),
                              child: Icon(
                                Icons.star,
                                color: Colors.white,
                                size: 14,
                              )),
                          SizedBox(
                            width: 6,
                          ),
                          Text('Do you recommend ${widget.name} ?'),
                        ],
                      ),
                      Row(
                        children: <Widget>[
                          Expanded(
                            child: OutlineButton(
                              highlightedBorderColor: kSecondaryColor,
                              color: kSecondaryColor,
                              borderSide: BorderSide(color: kSecondaryColor),
                              textColor: kSecondaryColor,
                              onPressed: () => null,
                              child: Text('NO'),
                            ),
                          ),
                          SizedBox(
                            width: 8,
                          ),
                          Expanded(
                            child: RaisedButton(
                              onPressed: () => null,
                              child: Text('YES'),
                            ),
                          ),
                        ],
                      )
                    ],
                  ),
                ),
              ),
              SliverPersistentHeader(
                pinned: true,
                delegate: SliverProfileTabs(),
              )
            ];
          },
          body: ProfileTabsView(data: widget),
        ),
      ),
    );
  }
}
...