Flutter中修改AutoTabsRouter.pageView物理特性避免重建昂贵子组件
解决方案
要实现切换physics属性同时避免昂贵子组件重建,核心是精准监听状态变化,只在必要时更新目标属性,而非触发整个路由组件的重建。具体做法如下:
1. 先修复状态类的语法错误
你的BottomBarModel里漏了分号,先补上:
class BottomBarModel extends ChangeNotifier { BottomBarModel(this.animationController); AnimationController animationController; bool isVisible = true; void toggleBar({required bool visibility}) { if (isVisible == visibility) { return; } if (visibility) { animationController.reverse(); } else { animationController.forward(); } isVisible = visibility; // 补上缺失的分号 notifyListeners(); } }
2. 用Selector包裹AutoTabsRouter
使用Selector替代直接在AutoTabsRouter中读取状态,它只会在你指定的状态(这里是isVisible)变化时才重建内部组件,避免不必要的全局重建:
ChangeNotifierProvider( create: (context) => BottomBarModel(animationController), child: Selector<BottomBarModel, bool>( // 只监听isVisible的变化,其他状态变更不会触发重建 selector: (context, model) => model.isVisible, builder: (context, isVisible, child) { return AutoTabsRouter.pageView( physics: isVisible ? const ClampingScrollPhysics() : const NeverScrollableScrollPhysics(), routes: const [Section1(), Section2(), Section3()], builder: (context, veryExpensiveWidget, _) { return Scaffold( bottomNavigationBar: BottomBar(), body: veryExpensiveWidget, ); }, ); }, ), );
为什么这样能避免子组件重建?
Selector只会在isVisible变化时重建内部的AutoTabsRouter,而非每次BottomBarModel有状态变更就触发。AutoTabsRouter的routes是const修饰的,内部会缓存已加载的页面组件,即使physics属性更新,已初始化的昂贵子页面也不会被重新创建,只会更新滑动行为。
内容的提问来源于stack exchange,提问作者Angela Riley
相关产品推荐
相关产品推荐

