Flutter中如何在map遍历循环中动态创建ScrollController
问题原因
你的报错来源于3个基础语法/使用错误:
- 强类型不匹配:将字符串直接赋值给
ScrollController类型变量,Dart作为强类型语言不允许不同类型变量直接赋值 - 变量重复定义:同一作用域下重复声明
scrollName变量,属于语法非法 - 参数类型错误:
SingleChildScrollView的controller参数要求传入ScrollController实例,你传入字符串也会触发类型报错
解决方案
你只需要在当前State类中用Map存储所有分类对应的ScrollController,以分类id为键、控制器实例为值,动态创建后直接调用即可,同时要注意在页面销毁时释放所有控制器避免内存泄漏。
步骤1:声明控制器存储Map与销毁逻辑
在当前页面的State类中添加如下代码:
class YourPageState extends State<YourPage> { // 存储每个分类id对应的滚动控制器,id类型根据你实际extra.id的类型调整 final Map<int, ScrollController> _scrollControllers = {}; @override void dispose() { // 页面销毁时释放所有控制器 for (var controller in _scrollControllers.values) { controller.dispose(); } super.dispose(); } // 你的其他原有代码 }
步骤2:遍历过程中动态调用控制器
修改你原有的业务代码如下:
Column( children: order!.extraOrders!.map((extra) { // 当前分类无对应控制器则创建,有则直接读取 if (!_scrollControllers.containsKey(extra.id)) { _scrollControllers[extra.id] = ScrollController(); } final currentController = _scrollControllers[extra.id]!; return SingleChildScrollView( scrollDirection: Axis.horizontal, controller: currentController, child: Row( children: extra.items!.map((e) { return Padding( padding: const EdgeInsets.only( right: 10.0, bottom: 10, top: 30, left: 10), // 你的其他业务逻辑 ); }).toList(), ), ); }).toList(), )
注意事项
- 遍历生成的Widget需要调用
toList()方法,否则返回的Iterable类型不符合Column的children参数要求 - 后续需要操作任意分类的滚动逻辑时,直接通过
_scrollControllers[对应分类id]即可拿到对应控制器,不受分类数量变化影响
内容的提问来源于stack exchange,提问作者thekavak
相关产品推荐
相关产品推荐

