Flutter如何跨dart文件导入调用函数及AdvancedDrawer跨页控制
解决方法
你的问题核心是两个点:
_advancedDrawerController、_handleMenuButtonPressed都是_DashboardState的私有成员(名称带下划线),跨类/跨文件默认无法直接访问- 你没有把父组件Dashboard的相关实例和方法通过参数传递给子组件HomePage,导致HomePage里调用的变量不存在
步骤1:修改HomePage,新增接收参数的属性
给HomePage增加两个必填参数,分别接收抽屉控制器实例和菜单按钮点击回调:
class HomePage extends StatefulWidget { const HomePage({ Key? key, required this.onMenuTap, required this.drawerController, }) : super(key: key); // 菜单按钮点击回调 final VoidCallback onMenuTap; // 抽屉控制器实例 final AdvancedDrawerController drawerController; @override State<HomePage> createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { @override Widget build(BuildContext context) { return Scaffold( body: SingleChildScrollView( child: SafeArea( child: Column( children: <Widget>[ Padding( padding: const EdgeInsets.all(12.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: <Widget>[ IconButton( // 调用父组件传递的回调 onPressed: widget.onMenuTap, icon: ValueListenableBuilder<AdvancedDrawerValue>( // 绑定父组件传递的控制器 valueListenable: widget.drawerController, builder: (_, value, __) { return AnimatedSwitcher( duration: const Duration(milliseconds: 250), child: Icon( value.visible ? Icons.clear : Icons.menu, key: ValueKey<bool>(value.visible), ), ); }, ), ), ], ), ), ], ), ), ), ); } }
步骤2:修改Dashboard,给HomePage传递参数
修改Dashboard中PageView的children部分,把当前State的抽屉控制器和开关方法传给每个HomePage实例即可:
body: PageView( controller: _pageController, children: <Widget>[ HomePage(onMenuTap: _handleMenuButtonPressed, drawerController: _advancedDrawerController), HomePage(onMenuTap: _handleMenuButtonPressed, drawerController: _advancedDrawerController), HomePage(onMenuTap: _handleMenuButtonPressed, drawerController: _advancedDrawerController), HomePage(onMenuTap: _handleMenuButtonPressed, drawerController: _advancedDrawerController), HomePage(onMenuTap: _handleMenuButtonPressed, drawerController: _advancedDrawerController), ], onPageChanged: (page) { setState(() { _selectedIndex = page; }); }, ),
可选优化
如果两个类不在同一个.dart文件里,你需要把AdvancedDrawerController的导入语句也加到HomePage对应的文件里,避免类型未定义的报错。
如果后续你的组件层级更深、传参路径太长,也可以用Provider、GetX等状态管理方案全局存储抽屉控制器,就不用逐层传参,当前场景用构造函数传参是最简单、性能最优的方案。
内容的提问来源于stack exchange,提问作者Asver Seb
相关产品推荐
相关产品推荐

