颤振的集团模式重复调用函数多次

时间:2019-11-15 14:42:06

标签: flutter provider bloc

我试图在flutter应用程序中使用块模式,我在返回Scaffold()之前在build函数体内编写代码;如下

@override
  Widget build(BuildContext context) {
    final ProductsController pController = Provider.of<ProductsController>(context);
    pController.addProducts();
    return Scaffold();
}

每件事都是完美的,但功能 addPrducts()调用次数过多,看起来下面的代码自我重复多次

pController.addProducts();

这是ProductsContoller类的结构

class ProductsController extends ChangeNotifier {
List<Products> _products=List();
AppDatabase appDB=AppDatabase();
  List<Products> get products=>_products;
addProducts() {
      appDB.getFromTable(AppDatabase.TBL_PRODUCTS).then((rows){
      rows.forEach((row){
        Products product=Products.fromJson(row);
        _products.add(product);


      });
      notifyListeners();
    });
  }
}

3 个答案:

答案 0 :(得分:0)

如果您的函数仅被调用一次,则应尝试覆盖initState()方法并在那里进行调用。如果您的班级扩展了StatefulWidget,则您的build(BuildContext context)方法可能会被调用多次。

final ProductsController pController

@override
void initState() {
    pController = Provider.of<ProductsController>(context);
    pController.addProducts();

    super.initState();
}

答案 1 :(得分:0)

如果您想执行一些操作,例如仅在有状态窗口小部件中获取屏幕数据一次,则可以使用void didChangeDependencies()和布尔值标志。

在初始化状态之后也立即调用

didChangeDependencies()。 在此State对象的依赖项更改时也调用。从此方法调用BuildContext.dependOnInheritedWidgetOfExactType是安全的。

final ProductsController pController
var _isLoadingForFirstTime = true;

@override
void initState() {
    super.initState();
}

@override
  void didChangeDependencies() {
    if (_isLoadingForFirstTime) {
       pController = Provider.of<ProductsController>(context);
       pController.addProducts();
    }
    _isLoadingForFirstTime = false;
    super.didChangeDependencies();
}

@override
  Widget build(BuildContext context) {
    return Scaffold(); // You Screen contents here
}

答案 2 :(得分:0)

您必须定义在其他类(有状态或无状态)中使用您的列表的小部件。

例如,如果您在 ListView 中使用 List,则必须为您的 ListView 和该类中的监视列表创建一个无状态类。

    class ProductList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GridView.builder(
      gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
        maxCrossAxisExtent: 260,
        childAspectRatio: 3 / 4.6,
      ),
      itemCount: context.watch<ProductsController >().productPjo.listProduct.length,
      shrinkWrap: true,
      itemBuilder: (_, i) {
        return  ItemProduct(context.watch<ProductsController >().productPjo.listProduct[i]);
      },
    );
  }
}