说这是我的提供者模型:
class Model extends ChangeNotifier {
Product _product = Product(-1);
Product get product => _product;
void updateProduct(Product newProduct) {
_product = newProduct;
notifyListeners();
}
}
class Product{
final int id;
Product(this.id);
static Product of(BuildContext context) {
final model = Provider.of<Model>(context, listen: false);
return model.product;
}
static void update(BuildContext context, Product newProduct) {
final model = Provider.of<Model>(context, listen: false); // desc_1
model.updateProduct(newProduct);
}
}
desc_1
:设置true
会导致错误,而保留false
不会更新我的小部件树。
我正在lib/main.dart
文件中对其进行更新:
Product.update(context, Product(10)); // calling this should update all listeners
我正在lib/home.dart
文件中监听它:
final id = Product.of(context).id; // doesn't listen to changes
谁能告诉我如何做到这一点。
PS:我知道我可以直接在Provider.of(...)
方法中直接使用build()
并使此模型正常工作,但那样的话,我总是必须使用2行。
final provider = Provider.of<Model>(context);
final product = provider.product;
答案 0 :(得分:1)
要做你想做的事:
在ChangeNotifierProvider<Model>(...)
中的main.dart
之后和MaterialApp(...)
之前,添加以下代码:
... child: Builder(
builder: (context){
return ChangeNotifierProvider.value(
value: Provider.of<Model>(context).product
child: MaterialApp(...));
}
这样,您将添加一个提供程序,该提供程序将侦听模型产品的更改。
现在,请确保现在class Product extends ChangeNotifier{...}
,而不是使用Product.of(context).id;
(因为现在有提供程序可以为您处理此操作,所以不需要),您可以这样做:
Provider.of<Product>(context).id;
函数update()
和updateProduct()
应该可以正常工作。