0
votes

Flutter StreamBuilder

J'ai ajouté deux éléments dans la liste, puis j'ajoute la liste à déposer.

  final _list = BehaviorSubject<List<String>>();
  get listSink => _list.sink;
  get listStream => _list.stream;

Mais quand j'essaye d'imprimer la liste dans TextField, elle s'imprime vide?

  StreamBuilder(
                      stream: _abcBloc.listStream,
                      builder: (context, snapshot) {
                        return TextField(
                          decoration: InputDecoration(
                              labelText: snapshot.data,
                             ....
                        );
                      },
                    ),

AbcBloc.dart

var list = new List<String>();
AbcBloc _abcBloc = AbcBloc(repository: null);

 @override
  void didChangeDependencies() {
    _abcBloc = Provider.of<AbcBloc>(context);
    super.didChangeDependencies();
  }

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

    list.add('Electrical');
    list.add('Inspection');

    _abcBloc.listSink.add(list);
  }

Modifier

Après utilisation la suggestion répond, elle affiche une valeur nulle. Pourquoi est-ce arrivé?


0 commentaires

3 Réponses :


0
votes

Problèmes que je vois:

  • StreamBuilder n'a pas de type générique. Faites-le StreamBuilder>
  • Vous passez List au paramètre labelText. Vous devez passer String. (par exemple, snapshot.data.toString () )
  • Vous ne vérifiez pas si votre flux contient des données ou non dans le générateur. Vous pouvez le faire en utilisant la condition snapshot.hasData ou en définissant le paramètre initialData.

1 commentaires

pourquoi il affiche la valeur nulle?



1
votes

Premièrement, snapshot.data est une liste d'éléments de chaîne, donc pour afficher la liste sous forme de chaîne unique, vous devez ajouter un toString (); Deuxièmement, vous devez pour être plus précis avec les types - vous devez spécifier les données attendues par votre StreamBuilder, c'est-à-dire

    StreamBuilder<List<String>>(
      stream: _abcBloc.listStream,
      builder: (context, snapshot) {
        return TextField(
            decoration: InputDecoration(
          labelText: snapshot.data.toString(),
        ));
      },
    ),

En prenant votre exemple et en apportant ces deux modifications, cela a abouti à [Electrical, Inspection] code> affiché dans le champ de texte de mon appareil.


1 commentaires

pourquoi il affiche la valeur nulle?



0
votes

J'ai pu résoudre ce problème. Ce que j'ai fait, c'est mettre la liste et le flux dans didChangeDependencies.

  @override
  void didChangeDependencies() {
     _abcBloc = Provider.of<AbcBloc>(context);      
     list.add('Electrical');
     list.add('Inspection');    
     _abcBloc.listSink.add(list);
     super.didChangeDependencies();

  }


0 commentaires