我有自己的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());
});
}
答案 0 :(得分:1)
初始偏移是...... 初始偏移。不是当前的偏移量。 : - )
您可以通过调用ScrollController上的方法来更改偏移量,例如animateTo。