Provider .read() vs .watch()
Asked Answered
R

2

14

I just updated my flutter_bloc library to 6.1.1 in which states:

bloc' is deprecated and shouldn't be used. Use context.read or context.watch instead. Will be removed in v7.0.0. Try replacing the use of the deprecated member with the replacement.

Here is a part of code that I did have to change:

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(),
    );
  }
}

The part I did change is this: context.bloc<CoursesGroupBloc>().state.coursesGroupList, to context.read<CoursesGroupBloc>().state.coursesGroupList, and is now working.

In the documentation for the .read() function I read the following:

This method is the opposite of [watch]. It will not make widget rebuild when the value changes and cannot be called inside [StatelessWidget.build]/[State.build]. On the other hand, it can be freely called outside of these methods.

For some reason, this makes no sense, since the upper code is within a build of a StatelessWidget and is working with the .read() function but not with the .watch().

Am I missing something?

Rummer answered 13/11, 2020 at 11:38 Comment(0)
G
8

you didn't call context.read inside the StatelessWidget's build, you did that inside BlocProvider during creating ContractSubscriptionFormBloc. if you try to do the following:

class example extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    context.read<CoursesGroupBloc>().state.coursesGroupList;
    //the rest of your code
  }
}

this error will appear: Tried to use context.read<bloc> inside either a build method or the update callback of a provider

Geotropism answered 30/11, 2020 at 18:6 Comment(0)
B
-1

some times in provider the .read() is used to variables and .watch()is used to function.

Bunch answered 3/11, 2022 at 10:36 Comment(1)
Not really. You can also use .read for functions.Rummer

© 2022 - 2024 — McMap. All rights reserved.