#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
принимает два общих аргумента.