J'essaie d'obtenir un pays d'appareil (Android) dans le flutter. J'ai utilisé ce tutoriel , mais je pense que c'est la mauvaise approche pour mon problème.
Locale myLocale = Localizations.localeOf(context);
print(myLocale.languageCode.toString() + ' ' + myLocale.countryCode.toString());
Basé sur cela, j'ai quelques questions/problèmes:
en US
Même si j'ai mis la langue de l'appareil à Urdu Urdu - Pakistan. Alors, que manque-t-il?geoLocation
et obtenir la longitude et la latitude et décidez en fonction de ces données? Ou y a-t-il une autre approche plus simple pour obtenir un pays d'utilisateur?Remerciant d'anticipation.
veuillez utiliser le paquet https://pub.dev/packages/devicelocale
J'ai testé avec un réel appareil, ça marche bien
extrait de code
String locale = await Devicelocale.currentLocale;
code complet
import 'package:flutter/material.Dart';
import 'Dart:async';
import 'package:flutter/services.Dart';
import 'package:devicelocale/devicelocale.Dart';
void main() => runApp(MyApp());
/// Demo getting a device locale
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
List _languages = List();
String _locale;
@override
void initState() {
super.initState();
initPlatformState();
}
// Platform messages are asynchronous, so we initialize in an async method.
Future<void> initPlatformState() async {
List languages;
String currentLocale;
// Platform messages may fail, so we use a try/catch PlatformException.
try {
languages = await Devicelocale.preferredLanguages;
print(languages);
} on PlatformException {
print("Error obtaining preferred languages");
}
try {
currentLocale = await Devicelocale.currentLocale;
print(currentLocale);
} on PlatformException {
print("Error obtaining current locale");
}
// If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) return;
setState(() {
_languages = languages;
_locale = currentLocale;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Center(
child: Column(
children: <Widget>[
Text("Current locale: "),
Text('$_locale'),
Text("Preferred Languages: "),
Text(_languages.toString()),
],
)
),
),
);
}
}
si vous souhaitez obtenir le pays d'appareil sans utiliser "Geolocator", vous n'avez donc pas besoin d'obtenir la permission de l'appareil, vous pouvez utiliser le code ci-dessous:
Future<String> getCountry() async{
Network n = new Network("http://ip-api.com/json");
locationSTR = (await n.getData());
locationx = jsonDecode(locationSTR);
return locationx["country"];
}
Le code de classe réseau est ci-dessous:
import 'Dart:convert';
import 'Dart:io';
import 'package:http/http.Dart' as http;
class Network {
final String url;
Network(this.url);
Future<String> apiRequest(Map jsonMap) async {
HttpClient httpClient = new HttpClient();
HttpClientRequest request = await httpClient.postUrl(Uri.parse(url));
request.headers.set('content-type', 'application/x-www-form-urlencoded');
request.add(utf8.encode(json.encode(jsonMap)));
HttpClientResponse response = await request.close();
// todo - you should check the response.statusCode
String reply = await response.transform(utf8.decoder).join();
httpClient.close();
return reply;
}
Future<String> sendData(Map data) async {
http.Response response = await http.post(url,
headers: {'Content-Type': 'application/json; charset=UTF-8'},
body: jsonEncode(data));
if (response.statusCode == 200)
return (response.body);
else
return 'No Data';
}
Future<String> getData() async {
http.Response response = await http.post(url,
headers: {'Content-Type': 'application/x-www-form-urlencoded'});
if (response.statusCode == 200)
return (response.body);
else
return 'No Data';
}
}
vous pouvez également obtenir la ville et le fournisseur d'Internet.
J'ai eu le même problème à travailler sur une application avec des fonctionnalités spécifiques au pays. Toutes ces méthodes mentionnées ici sont bonnes, après avoir suivi tous moi-même, je me suis rendu compte que personne ne couvrira tous les scénarios possibles.
Donc, j'ai changé l'approche du problème. Au lieu de prendre la décision par programme, quel pays utilise-t-il de l'avant. Je pensais qu'il est préférable d'identifier le pays de l'utilisateur à l'aide de l'une des méthodes qui convient le mieux à votre application, puis présentez-la à l'utilisateur. S'ils souhait Ils peuvent le changer, sinon dans la plupart des cas, la détection automatique est valide.
Pour mon application, j'ai présenté des utilisateurs avec pays lors de la connexion et un bouton plat en bas pour la modifier si ce n'est pas correct.
Utilisez le flutter_sim_country_code , avec ce paquet, vous pouvez obtenir des variables de localisation d'utilisateurs et un code de pays directement à partir de l'utilisateur SIM et du fournisseur de réseau. Par exemple;
networkCountryIso,
simCountryIso,
ces variable contiennent toujours le code de pays,