你将不得不做一些数学运算!(不,不是mathssssss)。
似乎您的 goToNext() 函数是在应用程序运行时调用的,而不是在构建时调用的。这使它更容易一些 - 您可以简单地使用context.size
. 否则,您必须使用 LayoutBuilder 和 maxHeight。
然后你可以把它分成两半得到一半,然后添加/减去你需要的任何东西来让你的项目按你想要的方式定位(因为你在示例中指定它的高度为 90,我假设你可以使用 45 来得到什么你要)。
这是一个可以粘贴到文件中运行的示例:
import 'dart:async';
import 'package:flutter/material.dart';
void main() => runApp(Wid());
class Wid extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text("Scrolling by time"),
),
body: new Column(
children: <Widget>[
Expanded(child: Container()),
Container(
height: 300.0,
color: Colors.orange,
child: ScrollsByTime(
itemExtent: 90.0,
),
),
Expanded(child: Container()),
],
),
),
);
}
}
class ScrollsByTime extends StatefulWidget {
final double itemExtent;
const ScrollsByTime({Key key, @required this.itemExtent}) : super(key: key);
@override
ScrollsByTimeState createState() {
return new ScrollsByTimeState();
}
}
class ScrollsByTimeState extends State<ScrollsByTime> {
final ScrollController _scrollController = new ScrollController();
@override
void initState() {
super.initState();
Timer.periodic(Duration(seconds: 1), (timer) {
_scrollController.animateTo(
(widget.itemExtent * timer.tick) - context.size.height / 2.0 + widget.itemExtent / 2.0,
duration: Duration(milliseconds: 300),
curve: Curves.ease,
);
});
}
@override
Widget build(BuildContext context) {
return ListView.builder(
itemBuilder: (context, index) {
return Center(child: Text("Item $index"));
},
itemExtent: widget.itemExtent,
controller: _scrollController,
);
}
}