【发布时间】:2020-08-09 14:28:51
【问题描述】:
我有一个包含列表视图构建器的颤振应用程序 (聊天页面) 我需要将页面滚动到页面末尾到最后一条消息吗?
【问题讨论】:
标签: listview flutter dart scroll chat
我有一个包含列表视图构建器的颤振应用程序 (聊天页面) 我需要将页面滚动到页面末尾到最后一条消息吗?
【问题讨论】:
标签: listview flutter dart scroll chat
您需要创建一个 scrollController 并将其传递给 ListView 并运行如下代码:
class SampleList extends StatefulWidget {
@override
_SampleListState createState() => _SampleListState();
}
class _SampleListState extends State<SampleList> {
ScrollController _scrollController;
@override
Widget build(BuildContext context) {
return ListView.builder(
controller: _scrollController,
itemBuilder: (_, index) => ListTile(
title: Text(
index.toString(),
),
),
);
}
void scrollToBottom() {
final bottomOffset = _scrollController.position.maxScrollExtent;
_scrollController.animateTo(
bottomOffset,
duration: Duration(milliseconds: 1000),
curve: Curves.easeInOut,
);
}
@override
void initState() {
_scrollController = ScrollController();
super.initState();
}
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
}
【讨论】:
将 reverse: true 设置为 ListView 小部件会将最新的元素置于底部。有了这个,您可以轻松实现聊天时间线。
ListView.builder(
reverse: true,
itemBuilder: (context, index) => _chatCell(),
)
【讨论】:
在initState方法中初始化ScrollController类的对象。
记住:- 1) 调用 super.initState();在 initState 方法的顶部。 2) ListView 应该与滚动控制器的对象相连。
WidgetsBinding.instance.addPostFrameCallback((_) { scrollController.jumpTo(scrollController.position.maxScrollExtent); });
然后,在 build 方法的顶部添加上面的代码。它会自动滚动到消息列表视图的底部。
【讨论】:
完美的方法是添加
reverse: true
到ListView.builder() 并更改您为数据提供列表视图的方式。像这样。
与其正常检索,不如将其反转并提供给列表视图构建器。
<List> _messages = [...];
_messages.reversed.toList();
【讨论】: