почему я получаю только последнюю запись массива json, полученную из graphql с флаттером? - PullRequest
0 голосов
/ 19 июня 2019

Я прочитал все связанные вопросы, но моего решения нет.поэтому, пожалуйста, не делайте никаких вещей .... и будьте терпеливы, поймите проблему ...

моя проблема похожа на другую, но в случае трепетания я не могу найти решение

Мой результат GraphQL такой:

"user" : [
     {
        "name": "test6",
        "password": null,
        "lastMessageAt": null,
        "profilePhoto": null,
        "aboutme": null,
        "status": null,
        "firstLogin": false,
        "blockedAt": null
      },
      {
        "name": "asdhihgh",
        "password": null,
        "lastMessageAt": null,
        "profilePhoto": null,
        "aboutme": null,
        "status": null,
        "firstLogin": false,
        "blockedAt": null
      },
      {
        "name": "Anil Kumar Jat",
        "password": null,
        "lastMessageAt": null,
        "profilePhoto": null,
        "aboutme": null,
        "status": null,
        "firstLogin": false,
        "blockedAt": null
      }
    ]

, но во флаттере данные берутся в List _userData = (response.data['user']) as List<dynamic>;

после этой сборки ListView, используя ListView.Builder, чем

я показываю только последнюю копию записи в общем количестве записей ... означает

name : Anil Kumar Jat
name : Anil Kumar Jat
name : Anil Kumar Jat

что-то вроде этого.

Мой код во флаттере выглядит следующим образом:

class NewChat extends StatelessWidget {
   String _allUserQuery {
      return """
      query {
        user {
            _id
            name
            mobileNo
            createdAt
            status
            aboutme
            profilePhoto
            isBlocked
          }
        }
    """;
  }

  @override
  Widget build(BuildContext context) {
  return Scaffold(
      appBar: AppBar(title:Text('Chat'))
      body: Container(
          margin: EdgeInsets.symmetric(vertical: 5.0),
          child: Query(
   options: QueryOptions(document: _allUserQuery),
   builder: (QueryResult result, {VoidCallback refetch}) {
   if (result.errors != null) {
       print(result.errors);
   }
   if (result.loading) {
       return Center(child: CircularProgressIndicator());
   }
   if (result.data == null) {
        return Center(child: Text('No Data Found!'));
   }

    final List _userData = (result.data['user']) as List<dynamic>;

   return ListView.builder(
         itemCount: model.newUserList.length,
         itemBuilder: (BuildContext context, int index) {
             return Column(
                children: <Widget>[
                   ListTile(
                     dense: true,
                     title: Text(_userData[index]['name'].toString()),
                     onTap: () {},
                   ),
                   Divider(
                     height: 1.0,
                   ),
              ],
           );
        },
      );
    },
  ),
 )
 )
}

Выводится какэто:

Output of above code like this

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

я решаю проблему

Я использую эту настройку GraphQLClient

 ValueNotifier<GraphQLClient> client = ValueNotifier(
      GraphQLClient(
        cache: NormalizedInMemoryCache(
            dataIdFromObject: _typenameDataIdFromObject),
        link: link,
      ),
    );
    // ...
  }

  String _typenameDataIdFromObject(Object object) {
    if (object is Map<String, Object> &&
        object.containsKey('__typename') &&
        object.containsKey('id')) {
      return "${object['__typename']}/${object['id']}";
    }
    return null;
  }

, затем я получаю последний индекс объекта json.но теперь я возвращаю только null

  String _typenameDataIdFromObject(Object object) {
    return null;
  }

, тогда я получаю правильный результат

enter image description here

0 голосов
/ 19 июня 2019

у меня работает:

enter image description here

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  static Map<String, List<dynamic>> data = {
    "user": [
      {
        "name": "test6",
        "password": null,
        "lastMessageAt": null,
        "profilePhoto": null,
        "aboutme": null,
        "status": null,
        "firstLogin": false,
        "blockedAt": null
      },
      {
        "name": "asdhihgh",
        "password": null,
        "lastMessageAt": null,
        "profilePhoto": null,
        "aboutme": null,
        "status": null,
        "firstLogin": false,
        "blockedAt": null
      },
      {
        "name": "Anil Kumar Jat",
        "password": null,
        "lastMessageAt": null,
        "profilePhoto": null,
        "aboutme": null,
        "status": null,
        "firstLogin": false,
        "blockedAt": null
      }
    ]
  };
  List _userData = (data['user']) as List<dynamic>;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      color: Colors.grey,
      home: Scaffold(
        appBar: AppBar(
          title: Text('example'),
          backgroundColor: Colors.black87,
        ),
        body: Container(
            child: ListView.builder(
                itemCount: _userData.length,
                itemBuilder: (BuildContext ctxt, int index) {
                  return new Text(_userData[index]["name"]);
                })),
      ),
    );
  }
}
...