- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 flutter 应用程序,其中使用 ListView.Builder 生成列表,其中 itemCount 是 firestore 集合中的文档数。
当我将文档添加到集合中时,我可以通过打印看到值 snapshot.data.documents.length 发生变化,但 itemCount 没有变化,这会导致以下错误:
无效值:不在 0..17 范围内,包括:18
这是我创建的关于相同问题的 GitHub 线程:https://github.com/flutter/flutter/issues/39206
这是相关页面的代码,我从中得到错误的列表是靠近底部的 StreamBuilder
中的那个:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
/*
Visar kontaktinformation
*/
class Contact extends StatefulWidget {
@override
_ContactState createState() => _ContactState();
}
class _ContactState extends State<Contact> {
_hasDesc(desc) {
if (desc == '') {
return false;
} else {
return true;
}
}
String sortby = 'namn';
bool decending = false;
var showInfo;
TextEditingController controller = new TextEditingController();
String filter;
@override
void initState() {
super.initState();
controller.addListener(() {
setState(() {
filter = controller.text.toLowerCase(); //Gör om till gemener för att inte vara skiftlägeskänslig
});
});
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
Widget _personer(context, DocumentSnapshot document, index) {
//Skapar lista från databasen med kontaktinformation
//Denna lista måste vara i rätt ordning i databasen
final info = List<String>.from(document['info']);
//Om sökrutan är tom visas alla personer, om inte så visas bara de som matchar filtret
if (filter == null ||
filter == '' ||
document['namn'].toLowerCase().contains(filter) ||
document['beskrivning'].toLowerCase().contains(filter)) {
return Column(
children: <Widget>[
ListTile(
onTap: () {
setState(() {
for (int i = 0; i < showInfo.length; i++) {
if (i != index) {
showInfo[i] = false; // för att enbart ett kort ska vara expanderat åt gången
}
}
showInfo[index] = !showInfo[index];
});
},
title: Padding(
padding: const EdgeInsets.fromLTRB(0, 4, 0, 4),
child: Column(
children: <Widget>[
Text(
document['namn'],
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline,
),
Visibility(
visible: _hasDesc(document['beskrivning']),
child: Text(
document['beskrivning'],
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle.copyWith(fontSize: 20),
),
),
Visibility(
visible: showInfo[index],
child: ListView.builder(
//Bygger lista med kontaktinfo för varje person
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: info.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.only(top: 5),
child: ButtonTheme(
child: GestureDetector(
onTap: () {
Clipboard.setData(ClipboardData(text: info[index]));
//skapar snackbar
final copiedTextSnackBar = SnackBar(
content: Text('"${info[index].replaceAll('/', '')}" har kopierats'),
action: SnackBarAction(
label: 'Okej',
onPressed: () => Scaffold.of(context).hideCurrentSnackBar(),
),
);
//Stänger eventuell snackbar och viar en ny
Scaffold.of(context).hideCurrentSnackBar();
Scaffold.of(context).showSnackBar(copiedTextSnackBar);
},
child: Text(
info[index].replaceAll('/', '\n'),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.body1.copyWith(
fontSize: 16,
color: Color(0xff555555),
),
),
),
),
);
},
),
),
],
),
),
),
Divider(
color: Colors.black,
),
],
);
} else {
return SizedBox(
height: 0, //Visar ingenting om filtret inte stämmer
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: <Widget>[
Row(
children: <Widget>[
Flexible(
child: TextField(
decoration: InputDecoration(
contentPadding: EdgeInsets.fromLTRB(20, 10, 20, 10),
hintText: 'Sök',
border: InputBorder.none,
),
controller: controller,
),
),
Text('Sortera: ', style: TextStyle(fontSize: 16, color: Color(0xff555555)),),
DropdownButton<String>(
value: sortby,
onChanged: (String newValue) {
setState(() {
sortby = newValue;
});
},
items: [
DropdownMenuItem(
value: 'namn',
child: Text('Namn'),
),
DropdownMenuItem(
value: 'beskrivning',
child: Text('Titel'),
)
]
),
Stack(
children: <Widget>[
Visibility(
visible: decending,
child: IconButton(
icon: Icon(Icons.arrow_upward),
onPressed: () => setState(() {
decending = false;
}),
),
),
Visibility(
visible: !decending,
child: IconButton(
icon: Icon(Icons.arrow_downward),
onPressed: () => setState(() {
decending = true;
}),
),
)
],
)
],
),
Expanded(
child: Container(
child: StreamBuilder(
stream: Firestore.instance.collection('kontakt').orderBy(sortby, descending: decending).snapshots(), //Hämtar data från databas
builder: (context, snapshot) {
//För att inte skriva över existerande lista:
if (showInfo == null) {
//Listan genereras här för att slippa kalla på databasen två ggr
showInfo = List.generate(snapshot.data.documents.length, (index) => false);
}
if (!snapshot.hasData) {
return Container();
} else if (snapshot.hasData) {
print(snapshot.data.documents.length);
return ListView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) =>
_personer(context, snapshot.data.documents[index], index),
);
} else {
return Center(
child: Text("Error"),
);
}
},
),
),
),
],
),
);
}
}
最佳答案
我相信这是因为这条线:
if (showInfo == null) {
showInfo = List.generate(snapshot.data.documents.length, (index) => false);
}
showInfo
列表仅根据提供的条件更新一次。起初,showInfo
为 null
,因此它得到更新。在连续重建时,List 不会更新,因为它不再等于 null
。尝试删除 if 条件,看看会发生什么。
关于flutter - ListView.builder itemCount 未在 StreamBuilder 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57668409/
我对 Azure App Insights 采样有疑问。如果日志项的 itemCount 字段大于 1,是否意味着存在完全相同的请求并且已对其进行采样? 我的日志有一个请求发送此消息,其中 itemC
在 ListCollectionView , 我只是添加新的 GroupDescriptions . 但我正在寻找一种根据 ItemCount 对它们进行排序的方法的组。 所以在第一个位置我会得到最多
我已经尝试了几种不同的方法,但我无法让这个 viewpager 正常运行。我正在设置一个带有适配器的 viewpager2,但部分要求是 viewpager 可以手动滑动以及基于按钮以增加寻呼机 Vi
命名变量的正确方法是什么 int numItems; 对比 int itemCount; 或常数: public static final int MAX_NUM_ITEMS = 64; 对比 pub
很可能我的 SliverGrid 概念完全错了, 我想要做的是,UI 方面我想要 Flutter 中已经提供的可折叠 SliverAppBar。我的主要内容主体是一组来自 API 响应的图像,并且已经
RecyclerView offers a convenient way to preview the layout在 Android Studio 的 Design 选项卡中: tools:item
recyclerView 的 ItemCount 方法是: @Override public int getItemCount() { Log.e("Notification Size is
我基于 PagedListAdapter 实现了分页功能,并且我已经过检查工作正常。我尝试实现以如果 ListAdapter 项为空则显示 EmptyHolder 为特色。在调用 submitList
如果 itemcount属性与索引行数不完全匹配是个问题吗?有没有一种数字方法可以确保我拥有完整的全文索引? 更新:属性(property)fulltextcatalogproperty('datab
我如何才能获得当前的项目数量,即我的 PagingData持有?我找到的唯一解决方案是调用 shopListAdapter.itemCount但这总是返回 0。 我要做的是:获取我的 PagingAd
我正在使用 UICollectionView 和 UICollectionViewDiffableDataSource 并异步和同步获取数据以填充 View 。应用程序崩溃并显示以下消息:“由于未捕获
我正在尝试学习 C 编程,所以我尝试做一些练习。如下所示,搜索函数仅返回 1 或 -1,并且变量索引用于确定目标学生是否存在。但之后它再次被用来确定它是数组中的最后一项、中间项还是第一项。当我们已经将
我有一个 flutter 应用程序,其中使用 ListView.Builder 生成列表,其中 itemCount 是 firestore 集合中的文档数。在添加新文档之前,这可以正常工作。发生这种情
我有一个 flutter 应用程序,其中使用 ListView.Builder 生成列表,其中 itemCount 是 firestore 集合中的文档数。 当我将文档添加到集合中时,我可以通过打印看
我有错误说: "No named parameter with the name 'itemCount'. in Flutter GridView " 任何人都可以帮助解决这个错误。我是 Flutte
我有一个问题,调整我的容器的高度,我希望我的容器的高度取决于它的内容物。然而,容器几乎占据了整个屏幕(不包括应用程序栏和底部导航)。这是我制作的样本片段。。我想要我的容器的底部在我画的黑线上,如果物品
我有一个问题,调整我的容器的高度,我希望我的容器的高度取决于它的内容物。然而,容器几乎占据了整个屏幕(不包括应用程序栏和底部导航)。这是我制作的样本片段。。我想要我的容器的底部在我画的黑线上,如果物品
我正在尝试使用以下代码从 firestore 获取文档: Future getCategories() async { var firestore = Firestore.instance;
我是一名优秀的程序员,十分优秀!