【问题标题】:How can I detect continuously if scrolling is disabled in Flutter?如果在 Flutter 中禁用滚动,如何连续检测?
【发布时间】:2021-11-05 16:52:30
【问题描述】:

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

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

    });
  }

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

【问题讨论】:

    标签: flutter dart listview scroll scrollcontroller


    【解决方案1】:

    使用NotificationListener 小部件。

    示例:

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

    【讨论】:

      【解决方案2】:

      我通过将“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')),
            ],
          );
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-12-23
        • 1970-01-01
        • 2020-06-28
        • 2019-06-01
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-30
        相关资源
        最近更新 更多