在无状态窗口小部件中展开Listview,初始偏移量为

时间:2017-08-03 20:50:12

标签: dart flutter

我有自己的StatelessWidget和ListView。我希望它的状态由父StatefulWidget管理。

我想要的行为是,如果我改变一个值,listView会滚动(甚至跳转 - 它并不重要)到该值。

我认为如果我每次调用父级的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 个答案:

答案 0 :(得分:1)

初始偏移是...... 初始偏移。不是当前的偏移量。 : - )

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