在下面的代码中,我已经通过设置状态作为一个无状态widget中的函数调用,这怎么可能,我知道有什么问题与flutter,但它的东西一般的函数,我没有得到基本的权利,有人plz解释我这个概念。
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();
}
}
setState()
是一个方法里面的 State
类。在你的代码中,你有以下内容。
onPressed: () {
Demo(function: () {
setState(() {}); //PASSING SET STATE
});
},
这里你创建了一个 Demo
并给它一个回调作为参数。在这个回调中,你将调用 setState
中的一个方法。State
类,在Dart中,方法和函数可以像普通的变量和值一样传递。
在Dart中,方法和函数可以像普通变量和值一样被传递。在这种情况下,你已经把 setState
方法到无状态小组件的构造函数中。更准确地说,您已经封装了对有状态小组件的 setState
的匿名函数中,然后通过 该 函数到无状态小组件)。)
这可以用下面的方式更简单地演示。
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
从 a
被传入 b
,将其分配给 b.f
. 当 b
电话 f
,这就等于叫 a.doThing
直接,这可以通过 a.x
事后拥有更新值。这就是所谓的传递一个 回调,这是一个传递给另一个函数或对象的函数,然后可以调用,而不必直接引用传递进来的函数,即 b
可以调用 a.doThing
通过调用回调 f()
而无需明确调用 a.doThing()
. (注意:这是对回调的一个非常简单的解释,更详细的解释会涉及到如何实际使用传递的函数的细微差别。)
这不等于说 a.doThing
现在属于 b
和 b
现在并没有神奇地拥有一个 doThing
方法。同样的,当你传入 setValue
到一个无状态的部件,您并没有神奇地赋予该部件一个状态,您也没有因为突然能够调用"setState
"的实例,就像你从一个无状态的小组件中传递了一个 State<MyApp>
本身并称 stateObj.setState(...)
直接(当然不是说我建议你这么做)。