18 votes

fournisseur de flutter MultiProvider utilisant StreamProvider

Je développe une application Flutter en utilisant Provider (provider : 3.0.0+1). J'utilise MultiProvider en utilisant StreamProvider avec un contrôleur. Mais je reçois toujours une erreur.

Voici mon code

main.dart

Widget build(BuildContext context) {
return MultiProvider(
  providers: [
    StreamProvider<RecipeStreamService>.value(value: RecipeStreamService().controllerOut)
  ],
  child: MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Home Food',
        routes: {
          '/register': (BuildContext context) => RegisterPage(),
          '/login': (BuildContext context) => LoginPage()
        },
        theme: ThemeData(
          primaryColor: Colors.lightBlue[300],
          accentColor: Colors.green[300],
          textTheme: TextTheme(
            headline: TextStyle(fontSize: 42.0, fontWeight: FontWeight.bold, color: Colors.black54),
            title: TextStyle(fontSize: 22.0, fontStyle: FontStyle.italic),
            body1: TextStyle(fontSize: 18.0),
            button: TextStyle(fontSize: 20.0,fontWeight: FontWeight.normal, color: Colors.white)
          )
        ),
        home: HomePage(title: 'Home'),
      ),
  );
}

RecipeStreamService.dart

class RecipeStreamService {
   List<Recipe> _recipes = <Recipe>[];

   final _controller = StreamController<List<Recipe>>.broadcast();
   get controllerOut => _controller.stream;
   get controllerIn => _controller.sink;

   RecipeStreamService() {
      getRecipes();
   }

   addNewRecipe(Recipe recipe) {
     _recipes.add(recipe);
    controllerIn.add(_recipes);
  }

  getRecipes() async{
     List<Map<String, dynamic>> result = await ApiService().getRecipes();
     List<Recipe> data = result.map((data) => Recipe.fromMap(data)).toList();
     data.map((f) => addNewRecipe(f));
 }

 void dispose() {
   _controller.close();
 }
}

Mais je reçois toujours cette erreur :

type '_BroadcastStream<List<Recipe>>' is not a subtype of type 'Stream<RecipeStreamService>'
I/flutter (16880): When the exception was thrown, this was the stack:
I/flutter (16880): #0      MyApp.build (package:app_recipe/main.dart:20:80)

Ligne : 20:80 dans main.dart is (RecipeStreamService().controllerOut)

****** UPDATE ******

Changement du code Multiprovider pour le code suivant

 providers: [
    StreamProvider<List<Recipe>>.value(value: RecipeStreamService().controllerOut)
  ],

Aussi dans HomePage.dart, où je l'utilise, j'ai

final recipeService = Provider.of<List<Recipe>>(context);

Maintenant, recipeService est toujours considéré comme nul.

Merci

2voto

La raison pour laquelle vous voyez votre erreur est que le programme paramètre de type vous passez à StreamProvider<T> como T ne correspond pas à ce que vous êtes le retour à create .

Dans ce cas, vous voulez diffuser valeurs de type List<Recipe> .
Par conséquent, vous devez également passer cela pour le type générique :

StreamProvider<List<Recipe>>.value(value: stream)

Où le stream est votre List<Recipe> flux.


Si Provider.of<List<Recipe>>(context) est de retour null pour vous, cela signifie que vous n'avez pas ajouté de valeur au flux.

Si vous voulez avoir autre chose que null avant que le flux n'émette une valeur, vous pouvez passer le paramètre initialValue :

StreamProvider<List<Recipe>>.value(
  value: stream,
  initialValue: initialRecipes,
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X