#flutter #flutter-provider #flutter-bloc
#флаттер #flutter-provider #flutter-блок
Вопрос:
Я только что обновил свою flutter_bloc
библиотеку до 6.1.1
состояния, в котором:
bloc’ устарел и не должен использоваться. Вместо этого используйте context.read или context.watch. Будет удален в версии 7.0.0. Попробуйте заменить использование устаревшего элемента заменой.
Вот часть кода, которую мне пришлось изменить:
class ContractSubscriptionForm extends StatelessWidget {
final ContractSubscription contractSubscription;
const ContractSubscriptionForm(this.contractSubscription, {Key key})
: super(key: key);
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => ContractSubscriptionFormBloc(
contractSubscription,
context.read<CoursesGroupBloc>().state.coursesGroupList, // <---change to .read()
),
child: SubscriptionFormBody(),
);
}
}
Часть, которую я изменил, заключается в следующем: context.bloc<CoursesGroupBloc>().state.coursesGroupList,
context.read<CoursesGroupBloc>().state.coursesGroupList,
и теперь работает.
В документации к .read()
функции я прочитал следующее:
Этот метод противоположен [watch] . Он не будет перестраивать виджет при изменении значения и не может быть вызван внутри [StatelessWidget.build] / [State.build] . С другой стороны, его можно свободно вызывать вне этих методов.
По какой-то причине это не имеет смысла, поскольку верхний код находится в пределах build
StatelessWidget и работает с .read()
функцией, но не с .watch()
.
Я что-то упустил?
Ответ №1:
вы не вызывали context.read внутри сборки StatelessWidget, вы сделали это внутри BlocProvider во время создания ContractSubscriptionFormBloc . если вы попытаетесь выполнить следующее:
class example extends StatelessWidget {
@override
Widget build(BuildContext context) {
context.read<CoursesGroupBloc>().state.coursesGroupList;
//the rest of your code
}
}
появится эта ошибка:
Пытался использовать context.read<bloc>
внутри либо build
метод, либо update
обратный вызов поставщика
Ответ №2:
несколько раз в provider .read() используется для переменных и .watch() используется для работы.
Комментарии:
1. Не совсем. Вы также можете использовать .read для функций.