如果在 Flutter 中禁用滚动,如何连续检测?

How can I detect continuously if scrolling is disabled in Flutter?

我想经常检查是否无法滚动。

  @override
  void initState() {
    super.initState();

    WidgetsBinding.instance!.addPostFrameCallback((duration) {

      print("${_scrollViewController.position.maxScrollExtent}");
      // prints true if scrollable else false
      print("isScrollable = ${_scrollViewController.position.maxScrollExtent != 0}");

    });
  }

我试过这段代码,但它只被检测到一次,而不是连续检测到。 我该怎么办?

使用 NotificationListener 小部件。

示例:

NotificationListener<ScrollNotification>(
  child: ListView(
     children: MyListChilren()),
  onNotification: (ScrollNotification scrollNotif) {
    print(scrollNotif.metrics.maxScrollExtent);
  },
);

我通过将 'addPostFrameCallback' 添加到 'build' 方法内部来实现你想要的,如下所示。

您可以通过点击示例代码中的浮动按钮查看打印日志。
浮动按钮切换 'Container' 高度以更改 ListView 可滚动或不可滚动。

每当调用'build'方法时,'addPostFrameCallback'重建后调用回调并检查滚动是否可滚动。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  ScrollController _scrollController = ScrollController();
  double hhhh = 30;

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    WidgetsBinding.instance.addPostFrameCallback((duration) {
      print("${_scrollController.position.maxScrollExtent}");
      // prints true if scrollable else false
      print(
          "isScrollable = ${_scrollController.position.maxScrollExtent != 0}");
    });
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: _buildBody(),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            if (hhhh == 30) {
              hhhh = 3333;
            } else {
              hhhh = 30;
            }
          });
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }

  Widget _buildBody() {
    return ListView(
      controller: _scrollController,
      children: [
        Container(height: hhhh, child: Text('a')),
        Container(height: 30, child: Text('a')),
        Container(height: 30, child: Text('a')),
        Container(height: 30, child: Text('a')),
      ],
    );
  }
}