- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如标题中所述,我有一个要过滤的Listview。我查找了无休止的示例和代码片段,但是我仍然没有找到必须放置
来过滤列表的地方。
list = list.where((u)=>(u.name.toLowerCase().contains(_searchText.toLowerCase())
.toList()));
我认为我必须在构建列表的方式上进行一些更改。
Textfield已经可以正常工作,_searchText
始终是Textfield所说的。
我的代码:
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter_ac/collectible/collectible_details.dart';
import 'package:flutter_ac/nooklets/nook_scaffold.dart';
import 'package:flutter_ac/nooklets/nook_search.dart';
import 'package:flutter_ac/nooklets/nook_sheet.dart';
import 'package:flutter_ac/settings.dart';
import 'package:provider/provider.dart';
import 'collectible.dart';
final TextEditingController _filter = new TextEditingController();
class CollectibleList<C extends Collectible> extends StatefulWidget {
final List<C> collectibles;
final String title;
CollectibleList(
this.collectibles,
{
this.title,
}
);
@override
State<StatefulWidget> createState() => _CollectibleList<C>();
}
class _CollectibleList<C extends Collectible> extends State<CollectibleList<C>> {
Widget _appBarTitle;
bool _isSearching;
String _searchText = "";
List _collectibles = new List();
List _filteredCollectibles = new List();
Icon _searchIcon = new Icon(Icons.search);
final key = new GlobalKey<ScaffoldState>();
var list;
_CollectibleList(){
_filter.addListener(() {
if (_filter.text.isEmpty) {
setState(() {
_searchText = "";
_isSearching = false;
list = list.where((u)=>(u.name.toLowerCase().contains(_searchText.toLowerCase())
.toList()));
});
} else {
setState(() {
_searchText = _filter.text;
log(_searchText);
});
}
});
}
void _openDetails(Collectible collectible) {
var locale = Localizations.localeOf(context);
log("Opening collectible details for ${collectible.name(locale)}");
Navigator.push(
context,
MaterialPageRoute(builder: (context) => CollectibleDetails(collectible)),
);
}
@protected
@override
void initState() {
_appBarTitle = new Text(widget.title ?? "");
super.initState();
_isSearching = false;
}
@override
Widget build(BuildContext context) {
var locale = Localizations.localeOf(context);
var collectibles = widget.collectibles ?? [];
var list = ListView.separated(
separatorBuilder: (context, index) => Divider(
height: 1,
thickness: 1,
),
itemCount: collectibles.length,
itemBuilder: (context, index) {
Collectible collectible = collectibles[index];
return Consumer<Settings>(
builder: (context, settings, child) {
var titleStyle = !collectible.isObtained(settings) ?
null :
TextStyle(
color: Colors.lightGreen,
);
return Material(
color: Colors.transparent,
child: ListTile(
leading: Hero(
tag: collectible.heroTag,
child: Container(
child: Image(image: collectible.icon),
width: 50,
height: 50,
alignment: Alignment.center,
),
),
title: Text("${collectible.name(locale)}", style: titleStyle),
subtitle: collectible.listSubtitle(context),
trailing: collectible.listTrailing(context),
onTap: () => _openDetails(collectible),
onLongPress: () {
var isObtained = collectible.isObtained(settings);
collectible.setObtained(settings, !isObtained);
},
),
);
},
);
}
);
return Scaffold(
appBar: AppBar(
title: _appBarTitle,
centerTitle: true,
backgroundColor: Color.fromRGBO(95, 199, 188, 1.0),
actions: <Widget>[
IconButton(
icon: _searchIcon,
onPressed: () {
log("Searchbutton pressed");
_searchPressed();
//showSearch(context: context, delegate: Datasearch());
}
),
IconButton(
icon: const Icon(Icons.filter_list)
)
],
),
body: NookScaffold(
body: NookSheet(
child:
Column(children:<Widget>[
DropdownButton(onChanged: (String newValue) {
setState(() {
String dropdownValue = newValue;
});
}
),
Expanded(child: list)
],),
),
titleMargin: 0,
)
);
}
void _searchPressed() {
setState(()
{
if (this._searchIcon.icon == Icons.search) {
this._searchIcon = new Icon(Icons.close);
this._appBarTitle = new TextField(
controller: _filter,
decoration: new InputDecoration(
prefixIcon: new Icon(Icons.search),
hintText: 'Search...',
),
);
_handleSearchStart();
} else {
this._searchIcon = new Icon(Icons.search);
this._appBarTitle = new Text(widget.title ?? "");
_filteredCollectibles = _collectibles;
_filter.clear();
}
}
);
}
void _handleSearchStart(ListView list) {
setState(() {
_isSearching = true;
});
}
List<ChildItem> _buildList() {
return list.map((contact) => new ChildItem(contact)).toList();
}
List<ChildItem> _buildSearchList() {
if (_searchText.isEmpty) {
return list.map((contact) => new ChildItem(contact))
.toList();
}
else {
List<String> _searchList = List();
for (int i = 0; i < list.length; i++) {
String name = list.elementAt(i);
if (name.toLowerCase().contains(_searchText.toLowerCase())) {
_searchList.add(name);
}
}
return _searchList.map((contact) => new ChildItem(contact))
.toList();
}
}
}
class ChildItem extends StatelessWidget {
final String name;
ChildItem(this.name);
@override
Widget build(BuildContext context) {
return new ListTile(title: new Text(this.name));
}
}
最佳答案
看起来您正在尝试为文本字段实现“键入时搜索”功能。
有两种方法(可能更多)可以使此工作正常进行。
1.手动方式:
您可以使用流来侦听用户键入的内容,并根据输入的数据来过滤要馈送到列表项的数据。
更好的解释:当用户键入内容时,对于他/她所击中的每个字符,您都将数据发送到流中,而从另一侧,您将继续收听流向该流的内容。用户键入“A”,即可将“A”输入到流中,并从另一端获取相同的内容,并使用“A”过滤所有开始/结束(或任何需要的内容...)。用户键入的每个字符都适用。
代码示例:(假设您的UI和数据功能位于不同的文件中)
这就是您的BLOC类的外观,它具有一个StreamController,其工作只是监听数据并将其传递到您需要的位置。
class Bloc{
final _textFieldController = StreamController<String>();
//Use this to get data out of the stream
Stream<String> get enteredCharacter => _textFieldController.stream;
//returns functions to change data
Function(String) get addText => _textFieldController.sink.add;
dispose() {
_textFieldController.close();
}
}
//Here we are using a single instance of the bloc class, Which you can access from anywhere.
final bloc = Bloc();
现在,如何使用它?
var enteredCharacter = "";
bloc.enteredCharacter.listen((data) {
print("This is the character entered by the user: $data");
enteredCharacter = data;
_filterData(); //This function will filter your data based on the characters that the user hits.
});
简易或预构建方式:
autocomplete_textfield
的插件,它易于使用并且几乎可以完成工作。
关于listview - 搜索栏获取文本但不过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61517513/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!