NotificationListener在Android上不起作用

时间:2019-11-20 19:57:31

标签: flutter

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');
  }
}

2 个答案:

答案 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来获取用户触摸事件。