Flutter中如何向列表添加函数且列表调用时不立即执行?
解决Flutter中点击绑定函数提前执行的问题
问题根源
你当前的代码里,列表初始化时直接写function: function0(arg1, arg2),这会立即调用function0并把返回值赋值给function字段,而不是存储函数本身。所以应用一启动这些函数就自动执行了,而且点击时onTap绑定的只是函数执行后的返回值(如果函数是void类型,就是null),根本不会触发点击执行逻辑。
解决方案
1. 修改列表的函数存储方式
把每个function字段改成闭包(匿名函数),这样存储的是待执行的函数对象,初始化时不会触发执行:
List articles = [ { 'index': 0, 'name': 'Education', 'function': () => function0(arg1, arg2) // 用匿名函数包裹,仅在调用时执行 }, { 'index': 1, 'name': 'Education', 'function': () => function1(arg1, arg2) }, { 'index': 2, 'name': 'Education', 'function': () => function1(arg1, arg2) } ];
2. 修正InkWell的onTap绑定
直接把存储的函数对象赋值给onTap,点击时就会触发对应函数:
Widget slider() { return CarouselSlider( items: articles.map((oneObject) => Container( child: InkWell( onTap: oneObject['function'] as Function, // 直接绑定函数对象 child: Text(oneObject['name']) ) )).toList(), // 注意:map返回Iterable,需转成List才能给CarouselSlider用 ); }
可选:更安全的类型处理
如果担心类型转换报错,可以在onTap里显式调用函数:
onTap: () { final tapFunction = oneObject['function'] as Function; tapFunction(); }
修改完成后,应用启动时函数不会提前执行,只有点击对应的文章项时,才会触发绑定的目标函数。
内容的提问来源于stack exchange,提问作者ubakasi
相关产品推荐
相关产品推荐

