Попытка использовать StateNotifierProvider в соответствии с документацией

#flutter #dart #riverpod

Вопрос:

Прочитав документацию flutter_riverpod и riverpod для ConsumerWidget и StateNotifierProvider соответственно, я адаптировал пример кода следующим образом:

Это мой класс StateNotifier:

 class SelectedFoodsNotifier extends StateNotifier<List<Food>> {
  SelectedFoodsNotifier() : super([]);

  void add(Food food) {
    state = [...state, food];
  }

  void remove(int foodId) {
    state = [
      for (final food in state)
        if (food.id != foodId) food,
    ];
  }
}
 

Это мой провайдер:

 final selectedFoodsProvider = StateNotifierProvider((ref) => SelectedFoodsNotifier());
 

И это мой класс ConsumerWidget:

 import 'package:diabretes/providers/providers.dart';
import 'package:diabretes/respository/DatabaseRepository.dart';
import 'package:diabretes/widgets/FoodCalculator/no_foods_selected.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';

class CalculatorDrawer extends ConsumerWidget {
  @override
  Widget build(BuildContext context, ScopedReader watch) {
    List<Food> selected_foods = watch(selectedFoodsProvider);

    return AnimatedContainer(
        duration: Duration(milliseconds: 500),
        decoration: BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.only(
            topLeft: Radius.circular(10.0),
            topRight: Radius.circular(10.0),
          ),
          boxShadow: [
            BoxShadow(
                offset: Offset(0, 0),
                color: Colors.black.withOpacity(0.20),
                blurRadius: 16,
                spreadRadius: 2)
          ],
        ),
        child: NoFoodsSelected());
  }
}
 

Но линия

 List<Food> selected_foods = watch(selectedFoodsProvider);
 

выдает следующую ошибку: The argument type 'StateNotifierProvider<SelectedFoods, dynamic>' can't be assigned to the parameter type 'ProviderBase<Object?, List<Food>>'

Что я упускаю?

Заранее спасибо.

Ответ №1:

Поможет ли это, если вы введете своего провайдера таким образом?

 final StateNotifierProvider<SelectedFoodsNotifier, List<Food>> selectedFoodsProvider = StateNotifierProvider((ref) => SelectedFoodsNotifier());

 

Я всегда стараюсь явно вводить своих поставщиков, чтобы избежать ошибок при вводе при использовании моих поставщиков.

Ответ №2:

Попробуй final selectedFoodsProvider = StateNotifierProvider<SelectedFoodsNotifier, List<Food>>((ref) => SelectedFoodsNotifier());

StateNotifierProvider принимает два общих аргумента.