我正在尝试在另一个类中运行一个函数。当我这样做时,我收到一条错误消息,内容如下:
“ _ 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
类抽象化,但是该程序随后无法正常工作。如何在此类内调用函数?
答案 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()
,但这可能不是您想要的。您究竟何时希望您的方法运行()?