在学习颤振框架/Dart的过程中,我创建了一个示例项目。
我有一门课叫
person.dart
包括以下内容:
class Person {
String personFirstName;
String personLastName;
Person(
{this.personFirstName, this.personLastName}
);
}
接下来,我有一个“建设者”课程,
person_builder.dart
,其中我创建了人员的样本数据:
“导入”软件包:adv_search/model/person。飞镖;
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"
),
];
}
}
我已经在顶部导航栏添加了搜索功能。。。单击搜索图标后,搜索字段打开(在顶部导航内),允许我提供搜索输入。我有一个控制器,它有一个监听器,可以很好地捕获用户输入,如我的
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,
);
}
}
然而,我所停留并寻求指导的地方是
ListView.builder
这就是我现在返回的地方
ListView。建设者
(第106行)--
return filter == null || filter == "" ? personCard(people[index]) : people[index].contains(filter) ? personCard(people[index]) : new Container();
我得到的错误是:
NoSuchMethodError:类“Person”没有实例方法“contains”
接收者:“Person”的实例
尝试呼叫:contains(“约翰”)
目前,我无法过滤
完全
,鉴于上述错误。我想知道:
-
我怎样才能允许用户根据名字或姓氏进行搜索,并根据用户输入,使用筛选出的人的卡片刷新视图?
-
当我点击
搜索
图标,输入字段不是自动聚焦的。。。我的搜索功能设置正确吗?
-
是否有更好的/推荐的方法来创建数据(人员列表)?
编辑1
我应该补充一点:在应用程序启动时,我可以看到通过builder类创建的所有人的列表。
编辑2
补充
全部的
完整的代码文件;重新措辞了帖子的部分内容,并添加了几个附加问题。