1

我想不断检查是否无法滚动。

  @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}");

    });
  }

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

4

2 回答 2

0

使用NotificationListener小部件。

例子:

NotificationListener<ScrollNotification>(
  child: ListView(
     children: MyListChilren()),
  onNotification: (ScrollNotification scrollNotif) {
    print(scrollNotif.metrics.maxScrollExtent);
  },
);
于 2021-09-09T03:40:43.090 回答
-1

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

您可以通过单击此示例代码中的浮动按钮来检查打印日志。
浮动按钮切换“容器”高度以更改 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')),
      ],
    );
  }
}
于 2021-09-09T03:44:34.990 回答