【问题标题】:How am I able to pass setState in a stateless widget from a statefull widget我如何能够从有状态小部件传递 setState 在无状态小部件中
【发布时间】:2020-05-14 05:32:57
【问题描述】:

在下面的代码中,我已将 set state 作为无状态小部件中的函数调用传递,这怎么可能?有人请解释我这个概念。 提供评论以寻求帮助。

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();
  }
}

【问题讨论】:

  • 参考此演示示例以在 State 或无状态 stackoverflow.com/a/61743422/3946958987654321@ 中传递值
  • 不,问题是我如何在无状态小部件中传递设置状态调用,因为无状态小部件不知道什么是设置状态,所以我如何将它作为参数传递。我知道我可以通过,但(为什么)是我的问题
  • Demo(function: () { setState(() {}); //PASSING SET STATE }); 是否正常工作,或者您将此类回调传递给其他小部件有任何问题?
  • 即使我已经开发了一个成熟的应用程序,它也能正常工作,但问题是(如何)。
  • 你用过RaisedButton/OutlineButton/FlatButton吗?他们有onPressed 属性-这完全一样-您正在将一些函数传递给该按钮,并且在执行单击时,该按钮会调用该回调函数

标签: function flutter dart flutter-layout


【解决方案1】:

setState()State 类中的一个方法。在您的代码中,您有以下内容:

   onPressed: () {
          Demo(function: () {
            setState(() {});      //PASSING SET STATE
          });
        },

在这里你创建一个Demo 的实例并给它一个回调作为参数。在该回调中,您正在调用setState,这是State 类中的一个方法。

【讨论】:

  • 我没有得到回调的东西,请详细说明在这种情况下它是如何工作的。
  • @UTKARSHSharma 检查此stackoverflow.com/a/59504089/7015400
  • @UTKARSHSharma @UTKARSHSharma for ex in javascript function doHomework(subject, callback) { alert(Starting my ${subject} homework.); callback(); } doHomework('math', function() { alert('Finished my homework'); }); 这里,函数 doHomework 采用主题变量和函数引用 callback。在警报出现并且您知道主题后,将调用函数(回调)。所以基本上回调是一个函数,它被称为对发生的事情的响应。它可以是单击按钮的响应,也可以是从数据库中检索数据的响应
  • @UTKARSHSharma 因此不会立即调用回调,它是响应发生的事情而调用的函数。这就是为什么它被称为“回调”的原因,您可以将其视为稍后给我打电话。 Flutter 中的所有按钮都使用回调函数,这些函数在用户单击按钮时被调用。 Flutter 中的所有异步代码都使用了回调,这些回调在数据被检索到的时候被调用
【解决方案2】:

在 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

在此示例中,来自 adoThing 被传递到 b,后者将其分配给 b.f。当b调用f时,和直接调用a.doThing是一样的,可以通过a.x事后更新值来表示。这就是所谓的传递回调,这是一个传递给另一个函数或对象的函数,然后可以调用而无需直接引用传入的函数。即b 可以通过调用回调f() 来调用a.doThing,而无需显式调用a.doThing()(注意:这是对回调的非常简单的解释,更详细的解释涉及到传递函数的实际使用方式的细微差别。)

这与说a.doThing 现在属于b 不同,而b 现在没有神奇的doThing 方法。同样,当您将setValue 传递给无状态小部件时,您并没有神奇地授予该小部件一个状态,并且您不会因为突然能够从无状态小部件调用“setState”而违反 Flutter 规则。如果您传递了State&lt;MyApp&gt; 本身的实例并直接调用stateObj.setState(...)(当然,我不建议您这样做)。

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 2021-08-29
    • 2021-12-15
    • 2021-06-11
    • 2021-02-16
    • 2019-10-06
    • 2018-09-01
    • 2021-09-21
    • 2021-06-29
    相关资源
    最近更新 更多