0
votes

Flutter: remplissez un champ de texte avec une chaîne sur les préférences partagées

J'essaie de remplir un champ de texte avec une chaîne stockée sur les préférences partagées, mais je ne comprends pas comment le faire.

Le cas est:

1 - Je me connecte sur le premier écran.

2 - Le nom d'utilisateur est enregistré dans les préférences partagées.

3 - Ensuite, le deuxième écran est appelé avec quelques champs de texte.

4 - Le champ du nom d'utilisateur doit être rempli avec l'utilisateur qui a été enregistré.

Voici comment je stocke le nom d'utilisateur sur le premier écran:

final _pecasController = TextEditingController(text: _read());

Et voici la fonction que j'utilise sur le deuxième écran pour récupérer le nom d'utilisateur:

  static _read() async {
    final prefs = await SharedPreferences.getInstance();
    final key = 'usuario';
    final value = prefs.getString(key);
    print('saved $value');
    String usu = value;
    return usu; //the modification
  }

Je peux charger le nom d'utilisateur sur le deuxième écran mais je ne peux pas le mettre dans un champ de texte, comment puis-je faire cela?

J'ai essayé une petite modification sur la fonction (ci-dessous) et leur passage la fonction sur le contrôleur de texte mais ne fonctionne pas, je suppose que ce n'est pas la bonne façon.

 static _read() async {
    final prefs = await SharedPreferences.getInstance();
    final key = 'user';
    final value = prefs.getString(key);
    print('saved $value');
    String usu = value;
  }

Le controlle:

 final prefs = await SharedPreferences.getInstance();
                      final key = 'user';
                      final value = loggedUser;
                      prefs.setString(key, value);
                      print('saved $value');


6 commentaires

Ajoutez ce que vous avez essayé pour TextField


ive vient de mettre à jour


Essayez _read (). Then ((String name) => name);


Sur le contrôleur? Je l'ai fait et j'ai l'erreur: type '(String) => String' n'est pas un sous-type de type '(dynamic) => FutureOf (dynamic> of' f '


@abrev, veuillez d'abord appeler cette méthode _read () dans votre état et après cela, vous obtenez la valeur de votre préférence partagée. Et puis passez simplement votre usu à textfield comme ce _pecasController final = TextEditingController (text: usu);


J'ai appelé le _read sur initstate et j'ai essayé de faire la partie contrôleur après cela, mais il ne trouve pas le "usu". Erreur: nom non défini «usu». Essayez de corriger le nom en un nom défini ou de définir le nom.


3 Réponses :


1
votes

Est-ce que ça marche pour toi?

class TheState extends State<TheWidget> {

  TextEditingController _pecasController = TextEditingController();

  @override
  void initState() async {
    _pecasController.text = await _read();
  }


1 commentaires

J'ai essayé mais j'ai une erreur. Quand j'ai essayé avec l'initstate async, j'ai eu une erreur indiquant que cette fonction ne pouvait pas être asynchrone, et quand j'ai essayé sans async, j'ai eu l'erreur "type future dynamic is not subype of string"



1
votes

Je l'ai finalement fait.

Merci pour les gars qui ont commenté ici et m'ont aidé, cela ne fonctionnait pas alors j'ai fait une recherche et j'ai finalement réussi à le faire fonctionner.

Voici les codes

La fonction:

  @override
  void initState() {
    super.initState();
    _read();

    WidgetsBinding.instance.addPostFrameCallback((_) async {
      _usuarioController.text = await _read();
    });

L'état d'initiation:

 static _read() async {
    final prefs = await SharedPreferences.getInstance();
    final key = 'usuario';
    final value = prefs.getString(key);
    print('saved tester $value');
    String usu = value;
    return usu;

  }

Je ne sais pas si c'est la meilleure façon de le faire, mais cela a fonctionné et c'est tout ce dont j'ai besoin pour le moment.


0 commentaires

0
votes

Comme j'étais dans le même bateau, même si cette réponse est ancienne, j'avais envie de donner une réponse. J'aurais posté cela dans les commentaires mais je suis incapable de le faire.

Future<String> _read() async {
    final _prefs = await SharedPreferences.getInstance();
    final _value = _prefs.getString('usuario');
    print('saved tester $_value');
    return _value ;
  }

Le code initial peut être plus petit, il n'est pas nécessaire de charger le _read () avant le WidgetsBinding. Tout ce qu'il fait est de l'appeler deux fois. Pour plus de lisibilité, je suggère également de raccourcir l'appel _read () et d'en faire un Future normal afin que vous soyez sûr que le type de retour est String. A également privatisé les valeurs.

@override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      _usuarioController.text = await _read();
    });
  }

Je sais que la réponse précédente était correcte et que cela fonctionnait, mais c'est mieux.


0 commentaires