[Fluth]NotificationListener(無限スクロールなど)にスクロール


ListViewまたはSingleChildScrollViewのように、ScrollViewによって継承されたスクロール可能部品を使用すると、無限スクロールを実現するために、現在のスクロール位置が追跡されることが多い.
通常はScrollControllerが使用され、以下に示すようにします.
var scrollController = ScrollController();

scrollController.addListener(() {
	print(scrollController.position);
});
スクロールイベントは、ScrollController.addListenerによって登録され、位置を追跡することができる.
しかし、NestedScrollViewのようにPrimiaryScrollControllerを使用すると、直接生成されたScrollControllerを使用することが難しくなり、上記の方法は使用できないため、イベントを実現するために他の方法を使用する必要がある.
このとき利用できるのはNotificationListenerです.ScrollViewの部品をNotificationListenerで包むと、スクロールアクティビティが受信されます.
return NotificationListener(
  child: ListView(
    children: [Text('A'), Text('B'), Text('C')],
  ),
  onNotification: (scrollNotification) {
    //스크롤 시 이 부분에서 이벤트가 발생한다.
    return false;
  },
onNotificationScrollNotificationをパラメータに変換し、このパラメータを用いて現在位置等を求めることができる.
  bool _onScrollNotification(ScrollNotification scrollNotification) {
  	
    var metrics = scrollNotification.metrics;

	//세로 스크롤인 경우에만 추적
    if (metrics.axisDirection != AxisDirection.down) return false;
    if (metrics.extentAfter <= 0) {
      //스크롤 끝에 닿은 경우 실행
    }
    return false;
  }
しかしながら、サブツリー内のScrollViewの全てのイベントを受信するため、複数のスクロール可能部材を重ねて使用する場合には、metrics.axisDirection等を用いて方向を検査・使用する必要がある.