【发布时间】:2020-04-30 06:53:37
【问题描述】:
如标题所述,我有一个要过滤的 Listview。我查找了无数的示例和代码 sn-ps,但我仍然没有找到我必须放置的地方
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));
}
}
【问题讨论】:
-
您每次都在使用小部件的收藏品填充列表视图。
var collectibles = widget.collectibles ?? [];。将 widget.collectible 分配给某个状态变量并过滤该变量。并将该变量提供给列表视图。 -
如果我写
filteredCollectibles = collectibles.where((u)=>(u.name.toLowerCase().contains(_searchText.toLowerCase()) .toList()));,我会得到一个错误:方法'toLowerCase'没有为'Function'类型定义。尝试将名称更正为现有方法的名称,或定义名为“toLowerCase”的方法。dart(undefined_method)