代码之家  ›  专栏  ›  技术社区  ›  Marcin Szałek

具有初始偏移量的无状态小部件中的颤振Listview

  •  0
  • Marcin Szałek  · 技术社区  · 7 年前

    我有自己的带有ListView的无状态小部件。我希望它的状态由父StatefulWidget管理。

    我认为,如果每次调用父对象的setState()方法时创建无状态小部件,带有initialOffset的scrollController会使列表“移动”,但它不会。值得一提的是,在第一次构建时,initialOffset按其应该的方式工作。

    下面是我的问题的示例代码:

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(new MyApp());
    }
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          title: 'Flutter Demo',
          theme: new ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: new MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
      final String title;
    
      @override
      _MyHomePageState createState() => new _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 5;
    
      void _incrementCounter() {
        setState(() {
          _counter++;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            title: new Text(widget.title),
          ),
          body: new MyClass(_counter),
          floatingActionButton: new FloatingActionButton(
            onPressed: _incrementCounter,
            child: new Icon(Icons.add),
          ),
        );
      }
    }
    
    class MyClass extends StatelessWidget {
      final int extraValue;
      final ScrollController scrollController;
    
      MyClass(this.extraValue):
      scrollController = new ScrollController(initialScrollOffset: extraValue*50.0);
    
      @override
      Widget build(BuildContext context) {
        return new ListView.builder(
            itemExtent: 50.0,
            itemCount: 100,
            controller: scrollController,
            itemBuilder: (BuildContext context, int index) {
          if (index != extraValue)
            return new Text(index.toString());
          else
            return new Text("EXTRA" + index.toString());
        });
      }
    }
    

    我不确定这是一个错误还是我的错误。

    编辑 受Ian Hickson回答的启发,我找到了解决问题的方法:

    void _incrementCounter() {
        setState(() {
          _counter++;
          myClass.scrollController.animateTo(_counter*50.0, duration: new Duration(seconds: 1), curve: new ElasticOutCurve());
        });
      }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Ian Hickson    7 年前

    初始偏移量是 最初的

    您可以通过调用ScrollController上的方法(如animateTo)来更改偏移量。