从类调用函数给我一个错误

时间:2019-09-15 20:41:08

标签: flutter dart

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

  

“ _ makeGetRequest”必须具有方法主体,因为“ 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类抽象化,但是该程序随后无法正常工作。如何在此类内调用函数?

4 个答案:

答案 0 :(得分:3)

class Home extends StatelessWidget {
  Home(){
    _makeGetRequest(); // option 1. to call the function only when the class is instantiated
  }
  @override
  Widget build(BuildContext context) {
    _makeGetRequest(); // option 2. to call the function on every rebuild
    return Scaffold(
      appBar: AppBar(title: Text('CRUD Bro')),
      body: Center(
        child: Text('My App'),
      ),
    );
  }
}

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

使用选项1或2。

答案 1 :(得分:1)

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

无论如何,此错误消息不是说“将其抽象化以解决您的问题     问题”,但实际上编译器感到困惑,它会读取以下行:

_makeGetRequest();

然后,编译器开始这样思考:“嗯,这是一个函数的签名(没有主体的函数!),因此该开发人员试图创建一个抽象类(因为抽象类可以具有没有主体的功能),但是该开发人员忘记了添加像这样的抽象关键字abstract class Home... 因此,是缺少抽象类并且缺少'abstract'关键字,还是缺少普通类和函数的主体?!!!!”,因此,这个可爱的编译器会在错误消息中告诉您其想法:< / p>

  

尝试使“首页”抽象,或在“ _makeGetRequest”中添加主体...

但是这两个选项都不是解决方案,就像我说的那样,它很混乱。

但是为什么会这样?

因为类就像“汽车”的概念,所以您不能驾驶汽车的想法,但是您需要首先根据该想法创建一个对象,即宝马,然后才能驾驶该宝马(换句话说,您可以在对象而非类上调用方法,因为您可以驱动car的对象,但不能驱动Car的想法。

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

1-(以任何语言)从不同的类调用方法,首先在该不同的类中创建对象,然后在该对象上调用它们: 请勿将其用于flutter的小部件,请参阅下面的选项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中)调用不同类中的方法,您需要一个块,有关更多详细信息,请参见my answer here

答案 2 :(得分:0)

您遇到的问题是,您正在类声明中进行方法调用。何时应调用_makeGetRequest? 您可以在编写的build()方法的主体内调用该方法(或为此添加到类的任何其他方法)。 那有意义吗?也许您可以进一步解释您想要实现的目标,也许还有更好的方法。 干杯

答案 3 :(得分:0)

您不能在类的内部直接调用与类成员相同级别的方法。您可以在build方法中调用_makeGetRequest(),但这可能不是您想要的。您究竟何时希望您的方法运行()?