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?
context.watch<T>() listens to changes on T. context.read<T>() returns T without listening to it. You were calling. context.
Contexts of reading are all the elements that influence how we read in different situations. The context includes: 1) the setting, 2) the text, and 3) the purpose for reading.
One of the main reasons to prefer Provider over Statefulwidget s is that, using Provider , you will rebuild only the widgets that needs that value (the Consumers ) while the other will not be rebuilt. Instead when you call setState the whole build function of the widget will be called.
Three major components make all of this possible: the ChangeNotifier class in Flutter, the ChangeNotifierProvider (primarily used in our sample app), and the Consumer widgets.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With