Получение Http запрошенного значения, представленного в ListTile на новый экран с помощью onTap - PullRequest
0 голосов
/ 02 апреля 2020

Я довольно новичок во Флаттере. Поэтому я искал Учебное пособие, где я мог бы иметь функцию поиска с 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),
                    ),
                  ],
                ),
              ),
            );
          }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...