Provider .read() vs .watch()

#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 для функций.