You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Getx状态管理调用set方法时出现NoSuchMethodError报错求助

解决Getx中调用set方法时出现的NoSuchMethodError错误

兄弟,我一眼就揪出问题所在了——你把sayac这个属性当成函数来调用了!

先看你拿到的报错:

Exception has occurred.
NoSuchMethodError (NoSuchMethodError: Class 'int' has no instance method 'call'. Receiver: 5 Tried calling: call("25"))

这个报错说得很清楚:当前sayac返回的是int类型的5,你却试图调用它的call方法(也就是像函数一样传参数("25")),但int类型根本没有这个方法,所以直接报错了。

问题根源

你在控制器里给sayac定义了getter和setter:

get sayac => _sayac.value; // 返回的是int值
set sayac(yeniDeger) => _sayac.value = yeniDeger; // 这是赋值用的setter

但在主页面的onTap里,你错误地用了函数调用的语法:

_controller.sayac("25"); // ❌ 错误用法:把属性当函数调用

正确解决方案

  1. 修改主页面的赋值方式
    把函数调用改成赋值操作,同时注意类型匹配(如果是字符串要转成int):

    onTap: () {
      _controller.sayac = int.parse("25"); // ✅ 正确:用setter赋值,先转成int
      // 或者直接传int值
      // _controller.sayac = 25;
    },
    
  2. 给setter加上类型约束(可选但推荐)
    为了避免后续不小心传入非int类型的值,建议给控制器里的setter指定类型:

    // 修改控制器里的setter
    set sayac(int yeniDeger) => _sayac.value = yeniDeger;
    

    这样如果不小心传了字符串,IDE会直接提示类型错误,提前规避问题。

修改后的完整代码

控制器代码(优化后)

import 'package:flutter/material.dart';
import 'package:get/get.dart';

class SayacController extends GetxController {
  var _sayac = 5.obs;

  get sayac => _sayac.value;
  // 添加int类型约束
  set sayac(int yeniDeger) => _sayac.value = yeniDeger;

  void arttir() {
    sayac = sayac + 1;
  }

  void azalt() {
    sayac = sayac - 1;
  }
}

主页面代码(修正后)

import 'package:flutter/material.dart';
import 'package:flutter_ilk_proje/sayac_controllerEx.dart';
import 'package:get/get.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  SayacController _controller = Get.put(SayacController());

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material App',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Material App Bar'),
        ),
        body: Center(
          child: InkWell(
            onTap: () {
              // 修正为赋值操作,并转换类型
              _controller.sayac = int.parse("25");
            },
            child: Container(
              child: Obx(
                () => Text(_controller.sayac.toString()),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

这样修改后,点击InkWell就能正常设置计数器的值啦!

内容的提问来源于stack exchange,提问作者mesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:13:11