Как отобразить переменную из возвращаемого файла json в тексте

#dart #flutter

#dart #флаттер

Вопрос:

 String empName;
Future<List> getUserData() async{
  final response = await http.post("http://172.16.161.34:8080/ebs/cfs/android_test_app/accessfile.php?q=getUserData",body:{
    "emp_id": widget.empId,
  });
  var dataUser = jsonDecode(response.body);
  empName = dataUser[0]['name'];

  return null;
}
  

Как отобразить переменную «EmpName» в строке от 2 до строки 70 «дочерний элемент: текст («)»

Полный код на Pastebin

Ответ №1:

Попробуйте этот способ .. создайте класс pojo для данных ответа таким образом..

  class UserData {
 final int albumId;
 final int id;
 final String title;
 final String url;
 final String thumbnailUrl;

 UserData({this.albumId, this.id, this.title, this.url, this.thumbnailUrl});

 factory UserData.fromJson(Map<String, dynamic> json) {
  return new UserData(
    albumId: json['albumId'],
    id: json['id'],
    title: json['title'],
    url: json['url'],
    thumbnailUrl: json['thumbnailUrl']);
 }
 }
  

создайте метод для вызова api..

 Future<UserData> fetchData() async {
 var result = await get('https://jsonplaceholder.typicode.com/photos');

 if (result.statusCode == 200) {
  return UserData.fromJson(json.decode(result.body));
 } else {
// If that response was not OK, throw an error.
throw Exception('Failed to load post');
}
}
  

после этого создайте глобальный объект, который извлекает данные..

   Future<UserData> userDataList;
  

нажмите на кнопку ..

             userDataList = fetchData();
  

после этого вы хотите распечатать данные..

 userDataList.then((userData){
  print(userData.title);
});
  

Ответ №2:

Прежде всего, ваша getUserData() функция никогда ничего не возвращает. Похоже, вам нужно только имя, чтобы эта функция могла выглядеть так:

 Future<String> getUserData() async{
  final response = await http.post("http://172.16.161.34:8080/ebs/cfs/android_test_app/accessfile.php?q=getUserData",body:{
    "emp_id": widget.empId,
  });
  var dataUser = jsonDecode(response.body);
  return dataUser[0]['name'];
}
  

Затем, чтобы установить empName переменную, которую вы должны использовать setState() .
Так что измените свой afterFirstLayout() метод на этот:

 @override
void afterFirstLayout(BuildContext context) async {
  // Calling the same function "after layout" to resolve the issue.
  getUserData().then( (userName) {
    setState(() {
      empName = userName;
    });
  });
}
  

Также вы, похоже, хотите перезагрузить имя после нажатия кнопки IconButton .
Поэтому вы можете переопределить свой код с помощью этого:

 IconButton(icon: Icon(Icons.shopping_cart),
  onPressed:() {
    getUserData().then( (userName) {
      setState(() {
      empName = userName;
      });
    });
  },
),
  

Комментарии:

1. setState(() { EmpName = getUserData(); }); является ошибкой

2. Я еще раз обновил свой ответ. Также изменен ваш код IconButton.