web-dev-qa-db-fra.com

Pays de l'appareil au flutter

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:

  • Je reçois toujours en US Même si j'ai mis la langue de l'appareil à Urdu Urdu - Pakistan. Alors, que manque-t-il?
  • Je souhaite afficher certains éléments d'application basés sur le pays que le périphérique se trouve, non basé sur la langue que les personnes vivant au Pakistan avec la langue définie sur l'anglais (US) obtiendront des articles réellement destinés aux utilisateurs basés aux États-Unis. Alors, devrais-je utiliser 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.

7
Aleem

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()),

            ],
          )
        ),
      ),
    );
  }
}
1
chunhunghan

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.

0
Malek Tubaisaht

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.

0
ravish.hacker

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,

0
Loïc Fonkam