我正试图在flutter应用程序中使用bloc模式,在返回Scaffold((之前,我在构建函数体内部编写代码;如下
@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();
});
}
}
如果函数只被调用一次,那么你应该尝试重写initState()
方法并在那里调用它。如果你的类扩展了一个StatefulWidget
,那么你的build(BuildContext context)
方法可能会被调用多次。
final ProductsController pController
@override
void initState() {
pController = Provider.of<ProductsController>(context);
pController.addProducts();
super.initState();
}
如果你想在有状态的小部件中只获取一次屏幕数据之类的操作,那么你可以使用void didChangeDependencies()
和布尔标志。
didChangeCodependencies((也在initState之后立即调用。当此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
}
您必须定义在其他类(有状态或无状态(中使用列表的小部件。
例如,如果在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]);
},
);
}
}