Flutterでスクロール系のWidget使うと、iOSの場合スクロールの端でバウンス効果があってびろーんとなる(BouncingScrollPhysics)。Androidの場合びろーんとはならないが(ClampingScrollPhysics)、グローエフェクトが掛かってぐにょーんとアニメ表示が出る(GlowingOverscrollIndicator)。アプリ全体でびろーんもぐにょーんも全否定したい場合はどうするかのメモ。
import 'package:flutter/material.dart';
class NeverGlowScrollBehavior extends ScrollBehavior {
const NeverGlowScrollBehavior();
@override
Widget buildViewportChrome(
BuildContext context, Widget child, AxisDirection axisDirection) =>
child;
@override
ScrollPhysics getScrollPhysics(BuildContext context) =>
const ClampingScrollPhysics();
}
class NeverGlowScrollConfiguration extends StatelessWidget {
final Widget child;
const NeverGlowScrollConfiguration({Key key, this.child}) : super(key: key);
@override
Widget build(BuildContext context) {
return ScrollConfiguration(
behavior: const NeverGlowScrollBehavior(),
child: child,
);
}
}
NeverGlowScrollBehaviorが要で、getScrollPhysics()で無条件にびろーんとならないClampingScrollPhysicsを返している。そしてbuildViewportChrome()で何もさせないようにしてグローエフェクトを潰している。
NeverGlowScrollConfigurationはNeverGlowScrollBehaviorを使うようにしているだけなのであってもなくても良い。
そしてMaterialAppのbuilderで、
return MaterialApp(
// ...
builder: (context, child) => NeverGlowScrollConfiguration(child: child),
とするとアプリ全体でびろーんもぐにょーんも消える。
「この画面だけNeverScrollableScrollPhysics使いたい」なんてときは個別にphysics設定とかすればオッケー。