Я довольно новичок во Флаттере. Поэтому я искал Учебное пособие, где я мог бы иметь функцию поиска с ListView. Это ответ, который я нашел. Фильтр просмотра списка в Flutter .
Мой вопрос теперь заключается в том, как мне получить значение из ListTile с помощью onTap для нового экрана. Поскольку то, что я сделал, оставляет только «Null»
Ниже кода ответа плюс код onTap, который я добавил в SecondScreen Class. У меня есть ощущение, что это как-то связано со значениями List, которых нет в классе.
Если кто-нибудь может помочь. Буду очень признателен. Спасибо .
Код: (Извините, если вставил / неправильно вставил)
import 'dart:async';
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
void main() => runApp(
new MaterialApp(
home: new HomePage(),
debugShowCheckedModeBanner: false,
),
);
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => new _HomePageState();
}
class _HomePageState extends State<HomePage> {
TextEditingController controller = new TextEditingController();
// Get json result and convert it to model. Then add
Future<Null> getUserDetails() async {
final response = await http.get(url);
final responseJson = json.decode(response.body);
setState(() {
for (Map user in responseJson) {
_userDetails.add(
UserDetails.fromJson(user),
);
}
});
}
@override
void initState() {
super.initState();
getUserDetails();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Home'),
elevation: 0.0,
),
body: new Column(
children: <Widget>[
new Container(
color: Theme.of(context).primaryColor,
child: new Padding(
padding: const EdgeInsets.all(8.0),
child: new Card(
child: new ListTile(
leading: new Icon(Icons.search),
title: new TextField(
textCapitalization: TextCapitalization.words,
controller: controller,
decoration: new InputDecoration(
hintText: 'Search', border: InputBorder.none),
onChanged: onSearchTextChanged,
),
trailing: new IconButton(
icon: new Icon(Icons.cancel),
onPressed: () {
controller.clear();
onSearchTextChanged('');
},
),
),
),
),
),
new Expanded(
child: _searchResult.length != 0 || controller.text.isNotEmpty
? new ListView.builder(
itemCount: _searchResult.length,
itemBuilder: (context, i) {
return new Card(
child: new ListTile(
leading: new CircleAvatar(
backgroundImage: new NetworkImage(
_searchResult[i].profileUrl,
),
),
title: new Text(_searchResult[i].firstName +
' ' +
_searchResult[i].lastName),
selected: true,
onTap: () {
var route = new MaterialPageRoute(
builder: (BuildContext context) => new NextPage(
value: UserDetails(),
),
);
Navigator.of(context).push(route);
},
),
margin: const EdgeInsets.all(0.0),
);
},
)
: new ListView.builder(
itemCount: _userDetails.length,
itemBuilder: (context,int index) {
return new Card(
child: new ListTile(
leading: new CircleAvatar(
backgroundImage: new NetworkImage(
_userDetails[index].profileUrl,
),
),
title: new Text(_userDetails[index].firstName +
' ' +
_userDetails[index].lastName),
selected: true,
onTap: () {
var route = new MaterialPageRoute(
builder: (BuildContext context) => new NextPage(
value: UserDetails(),
),
);
Navigator.of(context).push(route);
},
),
margin: const EdgeInsets.all(0.0),
);
},
),
),
],
),
);
}
onSearchTextChanged(String text) async {
_searchResult.clear();
if (text.isEmpty) {
setState(() {});
return;
}
_userDetails.forEach((userDetail) {
if (userDetail.firstName.contains(text) ||
userDetail.lastName.contains(text)) _searchResult.add(userDetail);
});
setState(() {});
}
}
class UserDetails {
final int id;
final String firstName;
final String lastName;
final String profileUrl;
UserDetails(
{
this.id,
this.firstName,
this.lastName,
this.profileUrl ='https://www.gannett-cdn.com/-mm-/9a6c51d16fd9ba067bd88984d421b8d5cc9b0ec4/c=0-0-800-451/local/-/media/USATODAY/popcandy/2013/10/14/1381773861000-uncle-grandpa.jpg'});
factory UserDetails.fromJson(Map<String, dynamic> json) {
return new UserDetails(
id: json['id'],
firstName: json['name'],
lastName: json['username'],
);
}
}
List<UserDetails> _searchResult = [];
List<UserDetails> _userDetails = [];
final String url = 'https://jsonplaceholder.typicode.com/users';
class NextPage extends StatefulWidget {
final UserDetails value;
NextPage({Key key, this.value}) : super(key: key);
@override
_NextPageState createState() => new _NextPageState();
}
class _NextPageState extends State<NextPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Categories")),
body: Container(
child: Column(
children: <Widget>[
Text(
(widget.value.firstName),
style: TextStyle(fontSize: 20.0),
),
],
),
),
);
}
}