我已经将ScrollController附加到[SliverAppBar,SliverList]的CustomScrollView
在默认情况下,我会使用reverse:true和animateTo(0.0)将滚动移动到添加的最后一个元素,但在这种情况下使用reverse也会反转SliverAppBar/SliverList顺序!
所以我想使用animateTo(sizeOfScrollableAfterElementAdded)但我找不到这个值.
谢谢 !
我使用这段代码来滚动:
WidgetsBinding.instance?.addPostFrameCallback((_) => _scrollToEnd());
Run Code Online (Sandbox Code Playgroud)
_scrollToEnd()方法是:
_scrollController.animateTo(
_scrollController.position.maxScrollExtent,
duration: const Duration(
milliseconds: 200,
),
curve: Curves.easeInOut,
);
Run Code Online (Sandbox Code Playgroud)
将其想象为一个普通的聊天屏幕。如果消息在 1 行中,它会滚动到裸露的底部。但是,一旦消息达到 2 行以上,它就不会一直滚动到底部。消息的行数越多,滚动到底部的次数就越少。
这是我进入聊天时的样子:

但如果我进一步向下滚动,这就是聊天的底部:

我注意到还有一种情况:
为什么会发生这种情况以及如何解决这个问题?
我正在使用CustomScrollView,并为其提供控制器。ScrollController可以工作,我什至在其中添加了一个侦听器并打印出滚动视图的位置。
CustomScrollView(
controller: _scrollController,
Run Code Online (Sandbox Code Playgroud)
现在,我要做的就是跳到initState()函数中的50.0位置。
_scrollController.jumpTo(50.0);
Run Code Online (Sandbox Code Playgroud)
但是,我得到了错误
scrollController未附加到任何滚动视图
我查看并找到了几种解决方案,但似乎都不适合我的配置,需要一些帮助。我将所有代码放在这里,看看是否有人知道在哪里应用ScrollController。我已经尝试了原始ListView,但是我从futureResponse在ListView构建器中动态构建了其他项。
import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:intl/intl.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:cswauthapp/models.dart';
import 'package:cswauthapp/ChatConvoDetail.dart';
import 'package:cswauthapp/Settings.dart' as Admin;
import 'package:cswauthapp/HomePage.dart' as HomePage;
import 'package:cswauthapp/main.dart' as MyHomePage;
import 'package:cswauthapp/PostAuthHome.dart' as PostAuthHome;
import 'package:image_picker/image_picker.dart';
import 'package:cswauthapp/ShowPic.dart';
import 'package:path/path.dart' as path;
import 'package:video_player/video_player.dart';
import 'package:cswauthapp/vplayer.dart' as vplayer;
class ChatDivided extends StatefulWidget {
ChatDivided({Key key, this.title, this.mychat}) : super(key: key);
static const String routeName = "/ChatDivided";
final ChatList mychat;
final String title;
@override …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个基本上是日志屏幕的列表。也就是说,我需要列表一直滚动到底部。
如何做到这一点?
我在 Flutter 应用中有聊天窗口。消息显示为小部件内的ListView小部件,我还有附加到窗口底部的消息输入小部件。
我想要
ListViewInputWidget代码:
class _MessagesPageState extends State<MessagesPage> {
final ScrollController listScrollController = ScrollController();
@override
Widget build(BuildContext context) {
return Scaffold(
....
body: Stack(
children: [
ListView.builder(
controller: listScrollController
....
),
InputWidget()]
);
}
class InputWidget extends StatelessWidget {
final TextEditingController _textEditingController = TextEditingController();
....
Row (
children: [
TextField(
controller: _textEditingController
),
IconButton(icon: ...., onPressed: (){})
]
)}
Run Code Online (Sandbox Code Playgroud) 当我将项目添加到网格视图的末尾时,我希望用户看到已添加的内容.这是我的意思的一个例子:
用户通过按+图标添加项目.问题是在第14项之后没有反馈表明已添加任何项目.将其添加到列表后,如何自动滚动到最后一项?
(加分点:如何在列表中间的某处添加时滚动到第n个项目)
这是滚动到列表视图末尾的答案,但如果我颠倒了列表的顺序,那么有时在顶行上有"缺少"项目看起来很奇怪.
这是我的代码:
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
@override
Widget build(BuildContext context) {
List items = [];
for (int i = 0; i < _counter; …Run Code Online (Sandbox Code Playgroud) 我有一个 flutter 应用程序包含一个列表视图生成器(聊天页面),我需要将页面滚动到页面末尾到最后一条消息?
是否可以在 Flutter 列表视图最初加载其所有数据后滚动到底部?我知道 scrollController.jumpTo() 逻辑,但是必须在某些事件处理程序中调用它,您将如何在列表视图构建完成后调用它,以便屏幕一打开它就会滚动到底部?