我有一个可滚动的AnimatedList,我希望每当将新项目添加到列表末尾时,它都会滚动到末尾。
我尝试应用此代码表单,ListView但它不起作用。
import 'package:flutter/material.dart';
class TestPage extends StatefulWidget {
@override
_TestPageState createState() => _TestPageState();
}
class _TestPageState extends State<TestPage> {
List<String> list = ["a", "a", "a", "a", "a", "a", "a"];
final ScrollController _listScrollController = new ScrollController();
final GlobalKey<AnimatedListState> _listKey = GlobalKey();
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: AnimatedList(
key: _listKey,
controller: _listScrollController,
initialItemCount: list.length,
itemBuilder: (BuildContext context, int index, Animation animation) {
return FadeTransition(
opacity: animation,
child: Container(
width: itemSize,
height: itemSize,
child: Text(list[index]),
),
);
},
),
),
floatingActionButton: FloatingActionButton(onPressed: _addNewItem),
);
}
_addNewItem() {
list.add(list.length.toString());
_listKey.currentState.insertItem(
list.length - 1,
duration: Duration(seconds: 1),
);
_listScrollController.animateTo(
_listScrollController.position.maxScrollExtent, // wrong value (this value is before add new item)
duration: const Duration(milliseconds: 250),
curve: Curves.ease,
);
}
}
Run Code Online (Sandbox Code Playgroud)
所以我需要稍微改变滚动代码。
const double itemSize = 40.0;
_listScrollController.animateTo(
_listScrollController.position.maxScrollExtent + itemSize,
duration: const Duration(milliseconds: 250),
curve: Curves.ease,
);
Run Code Online (Sandbox Code Playgroud)
但是它需要 itemSize 来硬编码(itemSize)或使用 BuildLayout、RenderBox 来确定新的项目大小。大家有没有更好的解决办法?
问题是您在添加项目之前对这些内容进行了动画处理。您需要 1 秒的时间来添加项目,请使用将在 1 秒后运行的计时器。
Timer(
Duration(milliseconds: 1100),
() {
_listScrollController.animateTo(
_listScrollController.position.maxScrollExtent,
duration: const Duration(milliseconds: 250),
curve: Curves.ease,
);
},
);
Run Code Online (Sandbox Code Playgroud)
用我的替换你的。
_addNewItem() {
list.add(list.length.toString());
_listKey.currentState.insertItem(
list.length - 1,
duration: Duration(milliseconds: 200),
);
Timer(
Duration(milliseconds: 220),
() {
_listScrollController.animateTo(
_listScrollController.position.maxScrollExtent,
duration: const Duration(milliseconds: 500),
curve: Curves.ease,
);
},
);
}
Run Code Online (Sandbox Code Playgroud)
输出:
| 归档时间: |
|
| 查看次数: |
1644 次 |
| 最近记录: |