0

NestedScrollView各タブで+ SliverAppBar+TabViewを使用しようとしScrollbarていますが、水平方向に滑ると例外が発生します:

AnimationController のステータス リスナーに通知しているときに、次のアサーションがスローされました: PrimaryScrollController は現在、複数の ScrollPosition にアタッチされています。

でラップしようとしましたScrollbarPrimaryScrollController、例外は消えましたが、外側のコントローラーと内側のコントローラーが同期されなくなりました。追加ScrollControllerしてNestedScrollViewから使用しようとしましNotificationListenerたが、速く滑ると奇妙なラグが発生しました:

NotificationListener<ScrollNotification>(
            onNotification: (ScrollNotification notification) {
              //print(notification.metrics.axisDirection);
              if (notification.metrics.extentAfter > 0 &&
                  notification.metrics.extentBefore > 0 &&
                  notification.metrics.axisDirection == AxisDirection.down) {
                double pixelnow = notification.metrics.pixels;
                double _jmpTo =
                    _scrollController.offset + (pixelnow - _scrollLocation);
                //print("pixel now : $pixelnow");
                //print("jumpto: $_jmpTo");
                if (_scrollController.position.maxScrollExtent >= _scrollController.offset 
                  && _scrollController.offset >= _scrollController.position.minScrollExtent ){
                  _scrollController.jumpTo(_jmpTo);
                  //_scrollController.jumpTo(value)
                }
                _scrollLocation = pixelnow;
              }
              return false;
            },

私の元のコードはここにあります:


import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(home: Scaffold(body: CommunityPage())));

class CommunityPage extends StatefulWidget {
  CommunityPage({Key? key}) : super(key: key);

  @override
  _CommunityPageState createState() => _CommunityPageState();
}

class _CommunityPageState extends State<CommunityPage> {
  //ScrollController _scrollController = ScrollController();
  //final TabController _tabController = TabController();
  final _tabs = <String>["Tab 1", "Tab 2", "Tab 3"];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: DefaultTabController(
        length: _tabs.length, // This is the number of tabs.
        child: NestedScrollView(
          headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
            // These are the slivers that show up in the "outer" scroll view.
            return <Widget>[
              SliverOverlapAbsorber(
                handle:
                    NestedScrollView.sliverOverlapAbsorberHandleFor(context),
                sliver: SliverAppBar(
                  automaticallyImplyLeading: false,
                  title: const Text("Community",style: TextStyle(color: Colors.black)),
                  //centerTitle: false,
                  pinned: true,
                  floating: true,
                  snap: true,
                  backgroundColor: Colors.grey[50],
                  expandedHeight: 85.0,

                  bottom: TabBar(
                    tabs: _tabs.map((String name) => Tab(text: name)).toList(),
                  ),
                ),
              ),
            ];
          },
          body: TabBarView(
            children: _tabs.map((String name) {
              
              return Builder(
                builder: (BuildContext context) {
                  return Scrollbar(
                    child: CustomScrollView(
                      key: PageStorageKey<String>(name),
                      slivers: <Widget>[
                        SliverOverlapInjector(
                          handle:
                              NestedScrollView.sliverOverlapAbsorberHandleFor(
                                  context),
                        ),
                        SliverFixedExtentList(
                          itemExtent: 50.0,
                          delegate: SliverChildBuilderDelegate(
                            (BuildContext context, int index) {
                              return ListTile(
                                title: Text('Item $index'),
                              );
                            },
                            childCount: 30,
                          ),
                        ),
                      ],
                    ),
                  );
                },
              );
            }).toList(),
          ),
        ),
      ),
    );
  }
}

私があきらめたとき、すべてがOKで、うまく機能していてScrollbarも、本当に混乱しています...RefreshIndicator

4

0 に答える 0