在下面的代码中,我将设置状态作为无状态小部件中的函数调用进行了传递,这怎么可能我知道flutter没什么问题,但是关于函数的某些问题,我基本上没有掌握正确的基础有人请给我解释这个概念。 提供注释以提供帮助。
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget { //STATEFUL WIDGET
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () {
Demo(function: () {
setState(() {}); //PASSING SET STATE
});
},
),
);
}
}
class Demo extends StatelessWidget { //STATE LESS WIDGET
final Function function;
Demo({this.function});
@override
Widget build(BuildContext context) {
return Container();
}
}
答案 0 :(得分:0)
setState()
是State
类内部的方法。在您的代码中,您具有以下内容:
onPressed: () {
Demo(function: () {
setState(() {}); //PASSING SET STATE
});
},
在这里创建Demo
的实例,并为其提供回调作为参数。在该回调内部,您正在调用setState
类中的方法State
。
答案 1 :(得分:0)
在Dart中,方法和函数可以像普通变量和值一样被传递。在这种情况下,您已将setState
方法从有状态窗口小部件传递到无状态窗口小部件的构造函数中。 (或者,更准确地说,您已将对状态小部件的setState
的调用包装在一个匿名函数中,然后将 that 函数传递给无状态小部件。)
这可以通过以下方式更简单地演示:
class A {
int x = 0;
void doThing() {
x = 5;
}
}
class B {
Function f;
B(this.f);
void runFunction() {
f();
}
}
// ...
A a = A();
B b = B(a.doThing);
b.runFunction();
print(a.x);
// Prints: 5
在此示例中,来自doThing
的{{1}}被传递到a
中,后者将其分配给b
。当b.f
调用b
时,与直接调用f
相同,这可以通过a.doThing
在事后具有更新后的值来表示。这就是所谓的传递回调,即将函数传递给另一个函数或对象,然后可以直接调用传递的函数而无需调用该函数。即a.x
可以通过调用回调b
来调用a.doThing
,而不必显式调用f()
。 (注意:这是对回调的非常简单的解释,而更详细的解释则涉及到如何实际使用所传递函数的细微差别。)
这不同于说a.doThing()
现在属于a.doThing
,并且b
现在还没有神奇的b
方法。同样,当您将doThing
传递给无状态窗口小部件时,您并不是在神奇地授予该窗口小部件一个状态,也没有通过突然能够从无状态窗口调用“ setValue
”来打破Flutter的规则。小部件与传递setState
本身的实例并直接调用State<MyApp>
相比(当然,我不建议您这样做)。