如何解决通过 Provider 以编程方式控制选项卡
我无法弄清楚如何在使用 ChangeNotifier
类的类中监听更改。更具体地说,在小部件构建方法之外。到目前为止,我已经尝试简单地将侦听器附加到类中,如下所示:
final providerObj = SomeProvider();
void initState() {
providerObj.addListener(() {
print("Something happens");
});
}
但这没有任何作用。我不知道为什么。我让它工作过一次,但后来它就死在了我身上。当提供者类的变量值发生变化时,不会触发任何事情。
这是SomeProvider
的片段
class SomeProvider with ChangeNotifier {
int _tabIndex = 0;
List<Tab> _tabs = [];
Tab _searchTab = new Tab(id: 0,name: 'Search');
void searchItems(String searchWord) {
_searchTab.items.addAll(_items
.where((item) => product.item.contains(searchWord))
.toList());
setTabIndex(0);
}
void setTabIndex(int index) {
_tabIndex = index;
notifyListeners();
}
/// Get all products
List<Category> get tabs {
return [..._tabs];
}
int get tabIndex {
return _tabIndex;
}
我尝试完成的是简单:当所选索引处于SomeProvider
类中时,控制所选选项卡。每次按下选项卡时,索引值都会保存在提供程序中。当值发生变化时,它应该触发对 animateTo()
实例的 TabController
调用。
这是因为我有一个单独的搜索小部件,需要将标签更改为搜索标签。我只是不知道如何在 build()
方法之外监听提供程序类中的更改并更改那里的 TabController
索引。
因此,我有一个基本的 TabBarView
,我为其提供了一个 TabController
实例。
class _ProductsState extends State<Products> with TickerProviderStateMixin {
late TabController _tabController;
void initState() {
super.initState();
_tabController = TabController(
vsync: this,length: 0,initialIndex: 0,);
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
Future<void> _fetchTabs(context) async {
await Provider.of<SomeProvider>(context,listen: false)
.fetchTabs();
_tabController = TabController(
vsync: this,length: Provider.of<SomeProvider>(context,listen: false)
.tabs
.length,);
}
Widget build(BuildContext context) {
// There's a FutureBuilder here etc.
...
child: TabBarView(
controller: _tabController,...
我正在尝试做的是:
void triggeredWhenStateChanges() {
_tabController.animateTo(Provider.of<SomeProvider>(context,listen: false).tabIndex);
}
有点跑题:我以前用过 React(不是 React-Native),有了它,你可以使用称为钩子的东西,当检测到值更改时,它可以执行副作用。使用 useEffect
钩子,当状态中的值发生变化时,我通常可以执行一些操作。我不知道我如何用 Flutter 做到这一点,如果它可以做到的话。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。