Flutter中TomatoIcon组件「需1个位置参数但传入0个」错误解决
问题:Flutter中TomatoIcon组件实例化报错「1 positional argument(s) expected, but 0 found」
开发Flutter应用时,使用TomatoIcon组件遇到如下错误:
1 positional argument(s) expected, but 0 found
该组件要求传入一个Rx<stateRound>类型的state位置参数,当前使用代码未传参导致报错,使用代码如下:
body: SingleChildScrollView( scrollDirection: Axis.vertical, child: Column( children: [ SizedBox(height: 40, child: HelloUser()), SizedBox(height: 68, child: ChipsBlog()), SizedBox(height: 80, child: TomatoIcon()), // 错误发生处 SizedBox(height: 77, child: HomePageTimerUI()), SizedBox(height: 580, child: StartPomodoro()), SizedBox(height: 580, child: ToDoPage()), SizedBox(height: MediaQuery.of(context).size.height, child: FooterPomoworko()), ], ), ),
TomatoIcon组件定义如下:
import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../open_source/controllers/countdown_controller.dart'; class TomatoIcon extends StatefulWidget { final Rx<stateRound> state; const TomatoIcon(this.state, {Key? key}) : super(key: key); @override State<TomatoIcon> createState() => _TomatoIconState(); } class _TomatoIconState extends State<TomatoIcon> { @override Widget build(BuildContext context) { return Obx( () => IconButton( onPressed: null, icon: widget.state.value == stateRound.done ? Image.asset('assets/icons/tomatoDone.png') : Image.asset('assets/icons/tomatoUndone.png')), ); } }
解决方案
1. 获取Rx<stateRound>类型的状态变量
从组件导入的文件可以看出,TomatoIcon依赖countdown_controller.dart中的stateRound枚举和GetX响应式变量。首先需要获取对应的控制器实例,从中拿到Rx<stateRound>类型的state变量。
假设你的CountdownController定义如下(通常会包含响应式状态变量):
class CountdownController extends GetxController { // 根据业务需求初始化状态,示例为undone final Rx<stateRound> state = stateRound.undone.obs; // 其他业务逻辑代码 }
在使用TomatoIcon的页面中,通过GetX获取控制器实例:
final CountdownController countdownController = Get.find<CountdownController>();
2. 传入参数实例化TomatoIcon
将获取到的countdownController.state作为位置参数传入TomatoIcon的构造函数,修改后的代码如下:
body: SingleChildScrollView( scrollDirection: Axis.vertical, child: Column( children: [ SizedBox(height: 40, child: HelloUser()), SizedBox(height: 68, child: ChipsBlog()), // 传入state参数 SizedBox(height: 80, child: TomatoIcon(countdownController.state)), SizedBox(height: 77, child: HomePageTimerUI()), SizedBox(height: 580, child: StartPomodoro()), SizedBox(height: 580, child: ToDoPage()), SizedBox(height: MediaQuery.of(context).size.height, child: FooterPomoworko()), ], ), ),
3. 补充说明
如果你的CountdownController还未全局初始化,需要在页面初始化时提前注入,比如在页面的initState中:
@override void initState() { super.initState(); // 若未全局注入,在此处初始化控制器 Get.put(CountdownController()); }
TomatoIcon通过Obx监听state变量的变化,当state.value切换为stateRound.done或其他值时,会自动更新显示的图标。
内容的提问来源于stack exchange,提问作者pomoworko.com
相关产品推荐
相关产品推荐

