首页 > 解决方案 > 从类调用函数给我一个错误

问题描述

我正在尝试在另一个类中运行一个函数。当我这样做时,我收到一条错误消息,内容如下:

'_makeGetRequest' 必须有一个方法体,因为 'Home' 不是抽象的。尝试将“Home”抽象化,或将主体添加到“_makeGetRequest”.dart(concrete_class_with_abstract_member)

这是代码:

class Home extends StatelessWidget {
  _makeGetRequest(); // Error is here

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('CRUD Bro')),
      body: Center(
        child: Text('My App'),
      ),
    );
  }
}

_makeGetRequest() async {
    print('hello');
}

我尝试使Home类抽象,但该程序不起作用。如何在此类中调用函数?

标签: flutterdart

解决方案


根据您的代码,该方法在同一个类中而不是另一个类中,对吗?

无论如何,这个错误消息并不是说“让它抽象来解决你的问题”,但实际上编译器很困惑,它读到这一行:

_makeGetRequest();

然后编译器开始这样想:“嗯,这是一个函数的签名(没有主体的函数!),所以这个开发人员正在尝试创建一个抽象类(因为抽象类可以有没有主体的函数)但是这个开发人员忘记添加抽象关键字像abstract class Home... 这样,是缺少抽象类和'abstract'关键字,还是缺少普通类和函数的主体?!!” 所以这个可爱的编译器会在错误信息中告诉你它的想法:

尝试将“Home”抽象化,或将正文添加到“_makeGetRequest”...

但这两种选择都不是解决方案,就像我说的那样,它只是感到困惑。

但为什么会这样呢?

因为类就像“汽车”的概念,你不能驱动汽车的概念,但你需要先从这个概念创建一个对象,一辆宝马,然后你可以驾驶那辆宝马(换句话说,你可以调用对象而不是类的方法,因为您可以驱动汽车的对象但不能驱动汽车的想法)。

要调用方法,您至少有以下 4 个选项:

1-(在任何语言中)调用来自不同类的方法,首先在该不同类中创建对象,然后在该对象上调用它们: 不要将其与颤振的小部件一起使用,请参阅下面的选项 4

class A {
  B b = B();
  b.makeGetRequest();
}

//..
class B {
  makeGetRequest() async { // NOT  PRIVATE(NO _)
    print('hello');
  }
}

2-(在任何语言中)调用同一类中的方法,在构造函数中调用它,就像Doc的答案一样。

3-(在 Flutter 中)调用同一类中的方法,在 Build 中调用它,就像 Doc 的回答一样。

4-(在 Flutter 中)调用不同类中的方法,您需要一个块,有关更多详细信息,请参见我的答案


推荐阅读