内部监听提供者

时间:2020-05-23 03:18:23

标签: flutter flutter-provider

说这是我的提供者模型:

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;

1 个答案:

答案 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()应该可以正常工作。