在学习Flutter框架/Dart的努力中,我创建了一个示例项目。
我有一个名为person.dart以下内容的课程:
class Person {
String personFirstName;
String personLastName;
Person(
{this.personFirstName, this.personLastName}
);
}
Run Code Online (Sandbox Code Playgroud)
接下来,我有一个“构建器”类,person_builder.dart我在其中创建人员的示例数据:
导入'包:adv_search/model/person.dart';
class PersonDataBuilder {
List getPeople() {
return [
Person(
personFirstName: "John",
personLastName: "Smith"
),
Person(
personFirstName: "Alex",
personLastName: "Johnson"
),
Person(
personFirstName: "Jane",
personLastName: "Doe"
),
Person(
personFirstName: "Eric",
personLastName: "Johnson"
),
Person(
personFirstName: "Michael",
personLastName: "Eastwood"
),
Person(
personFirstName: "Benjamin",
personLastName: "Woods"
),
Person(
personFirstName: "Abraham",
personLastName: "Atwood"
),
Person(
personFirstName: "Anna",
personLastName: "Clack"
),
Person(
personFirstName: "Clark",
personLastName: "Phonye"
),
Person(
personFirstName: "Kerry",
personLastName: "Mirk"
),
Person(
personFirstName: "Eliza",
personLastName: "Wu"
),
Person(
personFirstName: "Jackey",
personLastName: "Lee"
),
Person(
personFirstName: "Kristin",
personLastName: "Munson"
),
Person(
personFirstName: "Oliver",
personLastName: "Watson"
),
];
}
}
Run Code Online (Sandbox Code Playgroud)
我已将搜索功能添加到顶部导航栏,效果很好...单击搜索图标后,搜索字段将打开(在顶部导航栏中),允许我提供搜索输入。我有一个带有侦听器的控制器,可以很好地捕获用户输入,如我的main.dart文件所示:
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:adv_search/model/person.dart';
import 'package:adv_search/data/person_builder.dart';
void main() => runApp(new AdvancedSearch());
class AdvancedSearch extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'List of People',
home: new ListPersonPage(title: 'List of People'),
);
}
}
class ListPersonPage extends StatefulWidget {
ListPersonPage({Key key, this.title}) : super(key: key);
final String title;
@override
_ListPersonPageState createState() => _ListPersonPageState();
}
class _ListPersonPageState extends State<ListPersonPage> {
List people;
TextEditingController controller = new TextEditingController();
String filter;
Widget appBarTitle = new Text("List of People");
Icon actionIcon = new Icon(Icons.search);
@override
void initState() {
PersonDataBuilder pdb = new PersonDataBuilder();
people = pdb.getPeople();
controller.addListener(() {
setState(() {
filter = controller.text;
});
});
super.initState();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final appTopAppBar = AppBar(
elevation: 0.1,
title: appBarTitle,
actions: <Widget>[
new IconButton(
icon: actionIcon,
onPressed: () {
setState(() {
if (this.actionIcon.icon == Icons.search) {
this.actionIcon = new Icon(Icons.close);
this.appBarTitle = new TextField(
style: new TextStyle(
color: Colors.white,
),
decoration: new InputDecoration(
prefixIcon: new Icon(Icons.search, color: Colors.white),
hintText: "Search...",
hintStyle: new TextStyle(color: Colors.white)),
controller: controller,
);
} else {
this.actionIcon = new Icon(Icons.search);
this.appBarTitle = new Text("List of People");
}
});
},
),
],
);
ListTile personListTile(Person person) => ListTile(
title: Text(
person.personFirstName + " " + person.personLastName,
style: TextStyle(color: Colors.black45, fontWeight: FontWeight.bold),
),);
Card personCard(Person person) => Card(
child: Container(
decoration: BoxDecoration(color: Colors.grey[300]),
child: personListTile(person),
),
);
final appBody = Container(
child: ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemCount: people.length,
itemBuilder: (BuildContext context, int index) {
//return filter == null || filter == "" ? personCard(people[index]) : people[index].contains(filter) ? personCard(people[index]) : new Container();
return filter == null || filter == "" ? personCard(people[index]) : new Container();
},
),
);
return Scaffold(
appBar: appTopAppBar,
body: appBody,
);
}
}
Run Code Online (Sandbox Code Playgroud)
然而,我陷入困境并寻求指导的地方是ListView.builder
这是我目前返回的内容ListView.builder(第 106 行)--
return filter == null || filter == "" ? personCard(people[index]) : people[index].contains(filter) ? personCard(people[index]) : new Container();
Run Code Online (Sandbox Code Playgroud)
我收到的错误是:
NoSuchMethodError:类“Person”没有实例方法“包含”
接收者:“人”的实例
尝试调用: contains("John")
目前,鉴于上述错误,我根本无法过滤。我想知道:
编辑1
我应该补充一点:启动应用程序后,我可以看到通过构建器类创建的所有人员的列表。
编辑2
完整添加了所有代码文件;重新措辞了帖子的部分内容并添加了几个附加问题。
该错误准确地告诉您代码出了什么问题。当您编写时items[index].contains(searchFilter),编译器会尝试在 Person 类中查找“contains”方法。由于您尚未实现它,因此它会抛出异常。
实现搜索的一种方法如下:
List<Person> _personList = [] ;
List<Person> _searchList = [] ;
// populate _personList
_personList.forEach((p) {
if (p.personFirstName == searchFilter or p.personLastName == searchFilter) {
_searchList.add(f);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在列表视图中显示 _searchList 而不是完整的 _personList。例如,如下所示:
Widget _buildPersonListView() {
if (!_isSearching) {
return _listContents(_personList);
} else {
return _listContents(_searchList);
}
Run Code Online (Sandbox Code Playgroud)
然后定义 _listContents 如下:
Widget _listContents(List<Person> list) {
// implement list view
}
Run Code Online (Sandbox Code Playgroud)
将您的小部件构建方法设置为:
@override
Widget build(BuildContext context) {
return Scaffold(
.....
appBar: buildBar(context),
body: _buildPersonView()
);
}
Run Code Online (Sandbox Code Playgroud)
最后,根据用户交互设置_isSearching。
| 归档时间: |
|
| 查看次数: |
32007 次 |
| 最近记录: |