如何在 flutter 中创建同一提供者的多个实例
How to create multiple instance of same provider in flutter
我正在使用提供程序来获取数据并按如下方式通知侦听器:
class CategoryProvider with ChangeNotifier {
Future<void> getData() async {
......
......
notifyListeners();
}
}
我的 CategoryListView
小部件正在监听此提供程序,如下所示:
Widget build(BuildContext context) {
var collectionData = Provider.of<CategoryProvider>(context);
}
我正在推送 CategoryListView
的新实例,如下所示:
Navigator.of(context).pushNamed(CategoryListView.routeName);
我正在从 CategoryListView
小部件本身推送 CategoryListView
的新实例。
它在推送新实例时工作正常,但在导航回来时,所有 CategoryListView
小部件都显示最新的 CategoryListView
小部件的数据,因为它正在侦听同一个提供程序。
如何创建提供者的新实例并将其关联到小部件实例?有没有更好的方法来处理这个问题?
我已经解决了它,我正在发布解决方案,以便它可以帮助某人。
provider 的新实例在 CategoryListView
class 中声明如下:
final CategoryProvider collectionData = CategoryProvider();
类似地,我没有将 CategoryListView
的关联数据作为导航器参数传递,而是将其作为构造函数值传递,以便可以在 initState()
函数中访问这些值。
因此 CategoryListView
的新实例推送从
Navigator.of(context).pushNamed(CategoryListView.routeName);
到
Navigator.push(context, MaterialPageRoute(builder: (context) =>
CategoryPage(constructorValue) ));
在 initState()
函数上,为提供程序设置必要的值并进行必要的函数调用。
collectionData.catalogueId = widget.catalogueId;
collectionData.loadNextPage();
在 Widget build(BuildContext context)
上,侦听供应商已从
更改
Widget build(BuildContext context) {
var collectionData = Provider.of<CategoryProvider>(context);
}
到
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Color(0xff04063E),
title: Text(widget.catalogueName != null ? widget.catalogueName : ""),
),
body: ChangeNotifierProvider.value(
value: collectionData,
child: Consumer<CategoryProvider>(builder: (_, ctl, __) {
return _buildUI(collectionData);
}),
),
);
}
其中 _buildUI(collectionData)
是一个从提供实例 collectionData
.
构建 UI 的函数
另外,在 dispose:
上释放提供者实例
@override
void dispose() {
collectionData.dispose();
super.dispose();
}
我正在使用提供程序来获取数据并按如下方式通知侦听器:
class CategoryProvider with ChangeNotifier {
Future<void> getData() async {
......
......
notifyListeners();
}
}
我的 CategoryListView
小部件正在监听此提供程序,如下所示:
Widget build(BuildContext context) {
var collectionData = Provider.of<CategoryProvider>(context);
}
我正在推送 CategoryListView
的新实例,如下所示:
Navigator.of(context).pushNamed(CategoryListView.routeName);
我正在从 CategoryListView
小部件本身推送 CategoryListView
的新实例。
它在推送新实例时工作正常,但在导航回来时,所有 CategoryListView
小部件都显示最新的 CategoryListView
小部件的数据,因为它正在侦听同一个提供程序。
如何创建提供者的新实例并将其关联到小部件实例?有没有更好的方法来处理这个问题?
我已经解决了它,我正在发布解决方案,以便它可以帮助某人。
provider 的新实例在 CategoryListView
class 中声明如下:
final CategoryProvider collectionData = CategoryProvider();
类似地,我没有将 CategoryListView
的关联数据作为导航器参数传递,而是将其作为构造函数值传递,以便可以在 initState()
函数中访问这些值。
因此 CategoryListView
的新实例推送从
Navigator.of(context).pushNamed(CategoryListView.routeName);
到
Navigator.push(context, MaterialPageRoute(builder: (context) =>
CategoryPage(constructorValue) ));
在 initState()
函数上,为提供程序设置必要的值并进行必要的函数调用。
collectionData.catalogueId = widget.catalogueId;
collectionData.loadNextPage();
在 Widget build(BuildContext context)
上,侦听供应商已从
Widget build(BuildContext context) {
var collectionData = Provider.of<CategoryProvider>(context);
}
到
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Color(0xff04063E),
title: Text(widget.catalogueName != null ? widget.catalogueName : ""),
),
body: ChangeNotifierProvider.value(
value: collectionData,
child: Consumer<CategoryProvider>(builder: (_, ctl, __) {
return _buildUI(collectionData);
}),
),
);
}
其中 _buildUI(collectionData)
是一个从提供实例 collectionData
.
另外,在 dispose:
上释放提供者实例@override
void dispose() {
collectionData.dispose();
super.dispose();
}