我试图在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();
});
}
}
答案 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]);
},
);
}
}