我如何从无状态小部件传递无状态小部件中的setState

时间:2020-05-14 05:32:57

标签: function flutter dart flutter-layout

在下面的代码中,我将设置状态作为无状态小部件中的函数调用进行了传递,这怎么可能我知道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();
  }
}

2 个答案:

答案 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>相比(当然,我不建议您这样做)。