Как импортировать json в объект (Flutter)?
Подскажите как импортировать json в объект во Flutter и использовать повторно в других классах? Пример: получаю response c ключами 'timezone', 'access_token', 'userId'
signIn(String userName, pass) async {
final String serverKey = '##############';
final String url = 'https://example.com';
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
Map data = {
'server_key': serverKey,
'username': userName,
'password': pass
};
var jsonResponse;
var response = await http.post(url, body: data);
if (response.statusCode == 200) {
jsonResponse = json.decode(response.body);
var res = jsonResponse;
print(res);
list = res.map<Token>((json) => Token.fromJson(json)).toList();
if (jsonResponse != null) {
setState(() {
_isLoading = false;
});
sharedPreferences.setString("token", jsonResponse['access_token']);
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (BuildContext context) => MainPage()),
(Route<dynamic> route) => false);
print(jsonResponse['access_token']);
}
} else {
setState(() {
_isLoading = false;
});
print(response.body);
}
}
Создаю класс с названием Token
class Token {
String timezone;
String access;
Token({this.timezone, this.access});
factory Token.fromJson(Map<String, dynamic> json) {
return Token(timezone: json["timezone"], access: json["access_token"]);
}
}
Как теперь использовать переменную access в других dart файлах?
Ответы (1 шт):
Если я правильно понял вопрос, то вы хотите сериализовать такой же json в других местах проекта. Вот несколько советов как сделать так, чтобы таких вопросов не возникало. Разбей этот метод на части, сделай отдельный метод который сделает запрос и вернёт тебе сериализованный объект. Далее отдельный метод для перехода на другой экран.
List<Token> signIn(String username, String password) async {
final String serverKey = '##############';
final String url = 'https://example.com';
SharedPreferences sharedPreferences = await
SharedPreferences.getInstance();
Map data = {
'server_key': serverKey,
'username': username,
'password': password
};
var jsonResponse;
var response = await http.post(url, body: data);
if (response.statusCode == 200) {
jsonResponse = json.decode(response.body);
var res = jsonResponse;
if (jsonResponse != null) {
sharedPreferences.setString("token", jsonResponse['access_token']);
final List<Token> list = res.map<Token>((json) => Token.fromJson(json)).toList();
}
} else {
return null;
}
}
Future<void> onSignInTapped() async {
final List<Token> tokens = await signIn();
if (tokens != null) {
setState(() {
_isLoading = false;
});
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (BuildContext context) => MainPage()),
(Route<dynamic> route) => false);
} else {
setState(() {
_isLoading = false;
});
}
}
В результате чего в любом месте проекта можно будет вызвать метод signIn, который, в случае успешной сериализации вернёт нужный вам объект, желательно положить метод signIn в какой-то архитектурный слой отвечающий за запросы к API.