Возвращение объекта из будущего <List>во флаттер - PullRequest
0 голосов
/ 30 апреля 2020

Я борюсь за разбор Future для возражения. Я хочу получить данные User из Future<List<User>> в User объект. Я могу получить данные пользователя, но они все еще внутри Future.

Future<List<User>> getDataUser(String name_,int id_) async{
    var datajson=await Network.getData("https://jsonplaceholder.typicode.com/users?username=$name_&id=$id_");
    final response=jsonDecode(datajson);
    List<User> fuser=response.map((r)=>User.fromJson(r)).toList();
    User user_=fuser.single;
    print('response: '+user_.name);
    return fuser;
}

РЕДАКТИРОВАТЬ: Network.getData это Future<dynamic>

Когда я звоню activeUser(), я хочу это вернуть объект (User).

User activeUser(Future<List<User>> fuser){
    List<User> user=fuser as List<User>;
    print('user: '+user.single.username);
    return user.single;
}

Я всегда получаю такой вид error : type 'Future<List<User>>' is not a subtype of type 'List<User>' Я избегаю использования builder (FutureBuilder или ListView.Builder или еще ) потому что я не собираюсь составлять список. Это всего лишь одна карта. Я хочу, чтобы Future<List<User>> возвращал User объект. API REST, который я использую, возвращает список, а не объект

[
  {
    "id": 1,
    "name": "Leanne Graham",
    "username": "Bret",
    "email": "Sincere@april.biz",
    "address": {
      "street": "Kulas Light",
      "suite": "Apt. 556",
      "city": "Gwenborough",
      "zipcode": "92998-3874",
      "geo": {
        "lat": "-37.3159",
        "lng": "81.1496"
      }
    },
    "phone": "1-770-736-8031 x56442",
    "website": "hildegard.org",
    "company": {
      "name": "Romaguera-Crona",
      "catchPhrase": "Multi-layered client-server neural-net",
      "bs": "harness real-time e-markets"
    }
  }
]
  • Обратите внимание на прямоугольную скобку, это список с одной картой json.

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Я понял это.

Я создал класс ListUser для хранения списка, который вернулся из Future

class ListUser{
  final List<User> oneuser;

  DaftarUser({this.oneuser});

  factory ListUser.fromJson(List<dynamic> jsonuser){
    List userone=new List();
    userone=jsonuser.map((p)=>User.fromJson(p)).toList();

    return new ListUser(
      oneuser:userone
    );
  }
}

Затем я называю класс выше Future<List<User>>

Future<List<User>> getDataUser(String name_,int id_) async{
    var datajson=await Network.getData("https://jsonplaceholder.typicode.com/users?username=$name_&id=$id_");
    final response=jsonDecode(datajson);
    List<User> fuser=ListUser.fromJson(datajson).oneuser;
    // User user_=fuser.single;
    // print('response: '+user_.name);
    // those two line above are for seeing the value only, not too important
    return fuser;
}

Приведенная выше функция вернет List<User>, так что я могу изменить функцию activeUser, например:

User activeUser(List<User> fuser){
    User u=fuser.single;
    return u;
}

Теперь я могу вызывать этот activeUser везде, где мне это нужно.

Кстати, спасибо за помощь выше. Приветствия

0 голосов
/ 30 апреля 2020

Попробуйте это:

var fName;
...

getDataUser(name, id).then((fuser){
    print('user: '+ fuser.single.username);
    this.fName = fuser.single;});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...