将监听器附加到scrollController

3
我正在使用Flutter中的DraggableScrollableSheet,并想知道该表是否已折叠或展开。DraggableScrollableSheet的构建器提供了一个scrollController,我将其附加到监听器上。
我看到了这个有用的指南,但他们创建了一个ScrollController,而在我的情况下,scrollController由构造函数提供。我不明白如何获得他们相同的行为。
这是我的代码:
class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SizedBox.expand(
        child: myBottomSheet()
      ),
    );
  }
}

class myBottomSheet extends StatefulWidget{
  @override
  _myBottomSheetState createState() => _myBottomSheetState();
}

class _myBottomSheetState extends State<myBottomSheet> {
  double appbarSize=0.08;
  @override
  Widget build(BuildContext context) {
    return DraggableScrollableSheet(
      maxChildSize: 0.8,
      minChildSize: appbarSize,
      initialChildSize: appbarSize,
      builder: (BuildContext context, ScrollController scrollController) {
        scrollController.addListener(_scrollListener); // <----------------
        return Container(
          child: ListView.builder(
            controller: scrollController,
            itemCount: 25,
            itemBuilder: (BuildContext context, int index) {
              return ListTile(title: Text('Item $index'));
            },
          ),
        );
      },
    );
  }

  _scrollListener(){
    //use controller such in the guide
  }

1个回答

8
您只需要重构代码。将您的_scrollListener方法在builder中定义。
如下所示:
class _myBottomSheetState extends State<myBottomSheet> {
  double appbarSize=0.08;
  @override
  Widget build(BuildContext context) {
    return DraggableScrollableSheet(
      maxChildSize: 0.8,
      minChildSize: appbarSize,
      initialChildSize: appbarSize,
      builder: (BuildContext context, ScrollController scrollController) {
        _scrollListener(){
         //use controller such in the guide
        }

        scrollController.addListener(_scrollListener); // <----------------
        return Container(
          child: ListView.builder(
            controller: scrollController,
            itemCount: 25,
            itemBuilder: (BuildContext context, int index) {
              return ListTile(title: Text('Item $index'));
            },
          ),
        );
      },
    );
  }

这看起来非常不对:(1)你应该只在initState中添加一次监听器(你在每次调用build时都添加了一个监听器!你可能会为同一个控制器添加数百个监听器!);(2)你需要在dispose中处理监听器。 - Luke Hutchison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接