NotificationListener似乎无法在Android上运行-IOS可以工作。
如果您在IOS设备上运行以下程序,则会看到“ hello world”输出。 Android根本不调用回调函数_onStartScroll()。
class TempScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: NotificationListener(
onNotification: (scrollNotification) {
if (scrollNotification is ScrollUpdateNotification) {
_onStartScroll(scrollNotification.metrics);
}
},
child: CustomScrollView(
physics: AlwaysScrollableScrollPhysics(),
slivers: <Widget>[
SliverToBoxAdapter(
child: Container(
child: Center(
child: Text("Swipe Down"),
),
margin: EdgeInsets.only(top: 5),
),
),
],
)),
);
}
_onStartScroll(ScrollMetrics metrics) {
print('hello world');
}
}
答案 0 :(得分:0)
在Android上也无法运行上面的代码,但是当我添加检查scrollNotification是否为UserScrollNotification时可以使用。
例如
NotificationListener(
onNotification: (scrollNotification) {
if (scrollNotification is ScrollUpdateNotification) {
_onStartScroll(scrollNotification.metrics);
}else if (scrollNotification is UserScrollNotification ){
_onStartScroll(scrollNotification.metrics);
}
return true;
},
child: CustomScrollView(
physics: AlwaysScrollableScrollPhysics(),
slivers: <Widget>[
SliverToBoxAdapter(
child: Container(
child: Center(
child: Text("Swipe Down"),
),
margin: EdgeInsets.only(top: 5),
),
),
],
))
我没有Mac,因此无法在IOS上进行测试,但我希望这会有所帮助。让我知道当在IOS中运行时是否需要检查ScrollUpdateNotification。
答案 1 :(得分:0)
[ScrollUpdateNotification]表示该小部件已更改其滚动位置。
因此,如果您的小部件更改了其滚动位置,您将获得[ScrollUpdateNotification]
,但是IOS scrollView使用[BouncingScrollPhysics]作为默认物理。允许滚动偏移超出内容的范围,因此它将更改滚动位置;
android scrollView使用[ClampingScrollPhysics]作为默认物理。如果您的内容无法填充scrollView,则不允许更改滚动位置。因此您无法获得[ScrollUpdateNotification]
那么如何在Android设备上获取[ScrollUpdateNotification]?也许您可以更改CustomScrollView物理结构,例如:
import 'dart:math' as math;
import 'package:flutter/material.dart';
class TestPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: NotificationListener(
onNotification: (scrollNotification) {
if (scrollNotification is ScrollUpdateNotification) {
_onStartScroll(scrollNotification.metrics);
}
},
child: CustomScrollView(
physics: const AlwaysScrollableScrollPhysics(parent: BouncingScrollPhysics()),
slivers: <Widget>[
SliverToBoxAdapter(
child: Container(
child: Center(
child: Text("Swipe Down"),
),
margin: EdgeInsets.only(top: 5),
),
),
],
)),
);
}
_onStartScroll(ScrollMetrics metrics) {
print('hello world');
}
}
将 AlwaysScrollableScrollPhysics()更改为 const AlwaysScrollableScrollPhysics(parent:BouncingScrollPhysics()),那么您将获得[ScrollUpdateNotification]事件。
如果您不想改变物理特性,则可能需要使用GestureDetector来获取用户触摸事件。