J'ai une classe qui est ma classe getToken. Dans cette classe Ä ± récupérez le jeton qui est le jeton String . Voici mon getToken.dart
class GetCari{
getCari() async {
final response = await http.get("http://192.168.1.39:7070/api/v2/ARPs",
headers: {HttpHeaders.AUTHORIZATION: token});
if(response.statusCode ==200){
return Cari.fromJson(json.decode(response.body));
}else{
throw Exception("Failed to Load");
}
}
}
Je veux utiliser ce jeton dans ma classe getCari et obtenir les valeurs Json dans mon api de repos. Voici ma classe getCari.dart
class GetToken {
String token;
Future<Null> getData() async {
var url = "http://192.168.1.39:7070/api/v2/token";
http.post(url, body: {
"grant_type": "string",
"branchcode": "string",
"password": "string",
"username": "string",
"dbname": "string",
"dbuser": "string",
"dbpassword": "string",
"dbtype": "string"
}).then((response) {
print("Response Status: ${response.statusCode}");
//print("Response Body: ${response.body}");
print('access token is -> ${json.decode(response.body)['access_token']}');
token = json.decode(response.body)['access_token'];
});
}
}
Je voudrais demander comment Ä ± utiliser mon token (qui est obtenu de getToken.dart) dans ma classe getCari.dart. Comment Ä ± peut-il transmettre la variable de jeton à d'autres classes?
3 Réponses :
vous pouvez transmettre des données à la méthode getCari en créant un objet à partir de la classeGetCari () voir ceci
class GetToken {
String token;
Future<Null> getData() async {
var url = "http://192.168.1.39:7070/api/v2/token";
http.post(url, body: {
"grant_type": "string",
"branchcode": "string",
"password": "string",
"username": "string",
"dbname": "string",
"dbuser": "string",
"dbpassword": "string",
"dbtype": "string"
}).then((response) {
print("Response Status: ${response.statusCode}");
//print("Response Body: ${response.body}");
print('access token is -> ${json.decode(response.body)['access_token']}');
token = json.decode(response.body)['access_token'];
GetCari().getCari("fdfd");
});
}
}
class GetCari{
getCari(String token) async {
final response = await http.get("http://192.168.1.39:7070/api/v2/ARPs",
headers: {HttpHeaders.AUTHORIZATION: token});
if(response.statusCode ==200){
return Cari.fromJson(json.decode(response.body));
}else{
throw Exception("Failed to Load");
}
}
Veuillez utiliser les fonctions de niveau supérieur de Dart au lieu des classes qui n'ont pas besoin d'instanciation.
Ceci est mentionné dans la documentation de Effective Dart
import 'token_manager.dart' as token_manager // use your import path here
getCari() async {
// You can now access token from token_manager from any class like this.
final String token = token_manager.token;
}
String _token;
String get token => _token // To ensure readonly
Future<Null> setToken() async {
// set your _token here
}
En Java et C #, chaque définition doit être à l'intérieur d'une classe, il est donc courant de voir des «classes» qui n'existent que comme un emplacement pour remplir les membres statiques. D'autres classes sont utilisées comme espaces de noms - un moyen de donner un préfixe partagé à un groupe de membres pour les relier les uns aux autres ou éviter une collision de noms.
Dart a des fonctions, des variables et des constantes de premier niveau, vous n'avez donc pas besoin d'une classe juste pour définir quelque chose. Si vous voulez un espace de noms, une bibliothèque convient mieux. Les bibliothèques prennent en charge les préfixes d'importation et affichent / masquent les combinateurs. Ce sont des outils puissants qui permettent au consommateur de votre code de gérer les collisions de noms de la manière qui lui convient le mieux.
Si une fonction ou une variable n'est pas logiquement liée à une classe, placez-la au niveau supérieur. Si vous êtes préoccupé par les conflits de noms, donnez-lui un nom plus précis ou déplacez-le vers une bibliothèque distincte qui peut être importée avec un préfixe.
Votre jeton ne sera mis à la disposition des autres classes qu'après la résolution de la promesse setToken.
J'ai une erreur get_cari.dart. "Le jeton getter n'est pas défini pour la classe token_manager"
Avez-vous ajouté la String get token => _token getter String get token => _token à token_manager.dart?
Oui, ı a été écrit String get token => _token to the token_manager.dart
Pourquoi l'erreur indique-t-elle la classe token_manager? Avez-vous une classe définie dans votre token_manager.dart? Pouvez-vous montrer du code?
Veuillez modifier votre question et ajouter votre nouveau code en bas.
Vous ne devez pas envelopper votre code dans une classe. Veuillez supprimer la class TokenManager { première ligne class TokenManager { et la dernière ligne } de votre code. Avez-vous vu mon code? Il n'y a pas de classe dedans.
Je ramène votre question à son état d'origine afin que les futurs lecteurs en bénéficient.
Vous pouvez utiliser un gestionnaire de services comme get_it pour réutiliser des valeurs n'importe où dans votre application.
Créez la classe qui contiendra vos informations partagées
var mytoken= getIt.get<AppModel>().token;
Dans votre fichier main.dart, configurez votre instance GetIt
final getIt = GetIt.instance;
void setup() {
getIt.registerSingleton<GetToken>(GetToken());
}
Désormais, depuis n'importe où dans votre application, vous pouvez appeler cette classe et obtenir votre jeton.
class GetToken{
String token;
...
}
vous pouvez utiliser la préférence partagée ou vous pouvez créer une variable statique, ou vous pouvez envoyer par navigateur si vous passez à l'autre écran.