Виджет «Потребитель» имеет две основные цели:
Он позволяет получить значение от поставщика, когда мы не имеет BuildContext, который является потомком указанного поставщика, и, следовательно, не может использовать Provider.of. Этот сценарий обычно происходит, когда виджет, который создает провайдера, также является одним из его потребителей, как в следующем примере:
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => Foo(),
child: Text(Provider.of<Foo>(context).value),
);
}
В этом примере генерируется исключение ProviderNotFoundException, поскольку Provider.of вызывается с BuildContext, который является предком поставщика.
Вместо этого мы можем использовать виджет Consumer, который будет вызывать Provider.of со своим собственным BuildContext.
Используя Consumer, предыдущий пример станет:
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => Foo(),
child: Consumer<Foo>(
builder: (_, foo, __) => Text(foo.value),
},
);
}
Это не вызовет исключение ProviderNotFoundException и будет правильно создавать текст. Он также будет обновлять текст при каждом изменении значения foo.