- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我刚开始通过类(class)学习 Flutter,其中一个项目是编写一个 Hacker News 阅读器 应用程序。需要两个 HTTP 请求,一个用于获取 id 的顶部列表,另一个用于使用其 id 的每篇文章。
与 Google 的 The Boring Show 版本相反,我需要能够在用户向下滚动到热门文章总数(~500)时请求每篇文章。我还想尝试一种比我的类(class)中使用的许多流、转换器和变通方法更简单的方法。
我正在使用 StreamBuilder
通过 bloc
从流中获取顶级 ID和一个 FutureBuilder
对于 ListView.builder
的每一行从bloc
中获取文章的位置.数据是从 HTTP 请求或缓存(sqflite 数据库)中提取的。
它在向下滚动时完美运行,但在向上滚动时,它会跳到每个项目的顶部,除了前 4 个项目(因为它们已经在那个时候构建)。
几天来我尝试了不同的结构和模式,每当我使用 FutureBuilder
时,它的行为总是相同的在ListView.builder
里面.在模拟器和我的 Pixel 3 XL 上以调试和 Release模式尝试过。
The Boring Show 从 StreamBuilder
发送有限数量文章的方法到 ListView.builder
工作是因为 FutureBuilder
不需要,但无法获取更多文章。
顺便说一句,据我所知,即使 ConnectionState
向上滚动时也不会重新获取这些项目设置为 waiting
对于每个构建。
我已经在 YouTube 上添加了有关该问题的视频。希望它有效:
YouTube Video of ListView issue while scrolling up
这是显示列表的类。我组合了小部件以使其紧凑:
class TopList extends StatelessWidget {
@override
Widget build(BuildContext context) {
final StoriesBloc bloc = StoriesProvider.of(context);
return StreamBuilder<List<int>>(
stream: bloc.topList,
builder: (context, snapshot) {
return snapshot.hasData
? ListView.builder(
itemBuilder: (context, int index) {
return FutureBuilder<ItemModel>(
key: Key(snapshot.data[index].toString()),
future: bloc.getNewsItem(snapshot.data[index]),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.active:
case ConnectionState.waiting:
print('${snapshot.connectionState} for $index');
return Text('Loading...');
case ConnectionState.done:
return buildItem(snapshot.data, index);
}
});
},
)
: Center(
child: CircularProgressIndicator(),
);
});
}
Widget buildItem(ItemModel item, int index) {
print('Building row $index');
return ListTile(
key: Key(index.toString()),
leading: CircleAvatar(
child: Text('${index + 1}', style: TextStyle(fontSize: 14)),
radius: 16,
),
title: Text(item.title),
subtitle: Text('${item.score}'),
trailing: Column(
children: <Widget>[
Icon(Icons.comment),
Text('${item.descendants}'),
],
),
);
}
}
来自 flutter doctor
:
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel dev, v1.5.8, on Microsoft Windows [Version 10.0.17763.437], locale en-US)
[√] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[√] Android Studio (version 3.4)
[√] Android Studio (version 3.5)
[√] VS Code (version 1.32.3)
[√] Connected device (1 available)
• No issues found!
我希望上下滚动能够流畅,并且“正在加载...”文本会显示正在加载的项目。
这里是向下滚动而不是向上滚动时事件的打印输出:
I/flutter (13405): ConnectionState.waiting for 17
I/flutter (13405): Building row 17
I/flutter (13405): ConnectionState.waiting for 18
I/flutter (13405): Building row 18
I/flutter (13405): ConnectionState.waiting for 19
I/flutter (13405): Building row 19
I/flutter (13405): ConnectionState.waiting for 20
I/flutter (13405): Building row 20
I/flutter (13405): ConnectionState.waiting for 21
I/flutter (13405): Building row 21
I/flutter (13405): ConnectionState.waiting for 22
I/flutter (13405): Building row 22
I/flutter (13405): ConnectionState.waiting for 23
I/flutter (13405): Building row 23
I/flutter (13405): ConnectionState.waiting for 6
I/flutter (13405): Building row 6
I/flutter (13405): ConnectionState.waiting for 5
I/flutter (13405): Building row 5
I/flutter (13405): ConnectionState.waiting for 4
I/flutter (13405): Building row 4
I/flutter (13405): ConnectionState.waiting for 3
I/flutter (13405): Building row 3
I/flutter (13405): ConnectionState.waiting for 2
I/flutter (13405): Building row 2
I/flutter (13405): ConnectionState.waiting for 1
I/flutter (13405): Building row 1
I/flutter (13405): ConnectionState.waiting for 0
I/flutter (13405): Building row 0
问题可能很明显,但我无法弄清楚。
最佳答案
已修复!
好吧,从 flutter Discord 组的“buy dip kek”那里得到了一个建议,即在加载每个 FutureBuilder 的 future 时放置完全相同的小部件,一个 ListTile 和虚拟数据。这解决了问题。
关于flutter - 在 FutureBuilder 项目的 Flutter ListView 中向上滚动时如何修复 'jumping to top of each item'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55973138/
假设我从不同的 Url 获取不同的列表所以 Future 函数看起来像这样 Future> getCityDetails(Region selectedRegion) async {} Future>
我正在为用户列表使用 FuturBuilder。我通过 futur: fetchpost() 通过 API 获取用户。在专栏的开头,我实现了一个搜索栏。那么我该如何实现我的搜索栏正在搜索呢? Cont
我必须为屏幕的不同类型的类别构建多个 future builder ,例如:每周交易、全部、新到货等。我现在的代码非常准系统,但在这里。 +主屏幕 import 'package:flutter/ma
当我向下滚动时接近屏幕末尾时,我正在尝试更新我的 Thread 对象列表(以在我继续向下滚动时显示无限的项目列表) 我目前的设置如下: import 'package:flutter/material
用例: FutureBuilder 加载数据并构建小部件* 我按下一个按钮 → 我改变页面/屏幕 我按一个按钮回到 futureBuilder 的屏幕 问题:futureBuilder 是否重新加载数
文章Fetch data from the internet显示了 FutureBuilder 的以下代码片段处理快照。 FutureBuilder( future: post, builde
我的futurebuilder 在屏幕上显示错误几秒钟,然后显示结果这是错误日志: The following NoSuchMethodError was thrown building Future
我正在使用Future构建器从快照中获取数据并将其过滤到另一个创建标记的Future函数中。我通过过滤所有餐厅的位置获得了结果,但是该功能会不断更新,并且数据只会闪烁。 编辑2:JSON数据
当应用程序使用 Future 初始化时我从远程 JSON 获取数据文件。 而不是 return -在 widget当FutureBuilder有数据,我想导航到新屏幕。 我现在使用的方式: @over
我无法让FutureBuilder显示我的计算中的任何数据。我知道计算绝对正确,因为我可以得到正确的答案以打印到控制台中,但似乎无法使其显示在应用程序本身中。 这是代码的代码: Future get
我想显示一个在按下按钮时调用 api 检索到的对象。 我想在按下 floatingActionButton 时更新 FutureBuilder 小部件: class PostScreen ex
在我作为新屏幕的简单代码中,不幸的是 FutureBuilder 工作并从方法中获取数据两次!! 我不确定是什么问题,我该如何避免 class LessonDetail extends Statefu
我想显示一个在按下按钮时调用 api 检索到的对象。 我想在按下 floatingActionButton 时更新 FutureBuilder 小部件: class PostScreen ex
在我作为新屏幕的简单代码中,不幸的是 FutureBuilder 工作并从方法中获取数据两次!! 我不确定是什么问题,我该如何避免 class LessonDetail extends Statefu
我正在尝试查找离我当前位置最近的人。所以我正在从 firestore 中获取所有文档。 我的firestore结构是这样的, 所以我正在获取所有用户并通过计算距离来检查最近的用户,我想将过滤后的数据传
我试图在加载 Future Builder 中的数据时显示循环进度指示器,我尝试了两种方法来添加它,但是它们都不起作用。我怎样才能达到预期的结果? 我的代码 class _MyHomePageStat
当我更改特定 futurebuilder 小部件所依赖的状态时,在异步任务完成之前不会重新绘制小部件。我希望在状态改变后立即重绘小部件。下面是 futurebuilder 的代码: child: ne
我正在从这里获取 json:https://api.myjson.com/bins/1g3xpe ,在我的 flutter 应用程序中。 这是代码(我已经删除了不相关的部分)。问题是,FutureBu
我想知道什么时候应该使用 future builder。例如,如果我想发出一个 http 请求并在 ListView 中显示结果,一旦你打开 View ,我应该使用 future builder 还是
我想测试一个具有 Future 构建器的函数。函数是: Widget loadWidget() { return new FutureBuilder(
我是一名优秀的程序员,十分优秀!