我如何能从一个全状态的widget传递setState到一个无状态的widget?

问题描述 投票:0回答:1

在下面的代码中,我已经通过设置状态作为一个无状态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();
  }
}
function flutter dart flutter-layout
1个回答
0
投票

setState() 是一个方法里面的 State 类。在你的代码中,你有以下内容。

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

这里你创建了一个 Demo 并给它一个回调作为参数。在这个回调中,你将调用 setState 中的一个方法。State 类,在Dart中,方法和函数可以像普通的变量和值一样传递。


0
投票

在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

在这个例子中, doThinga 被传入 b,将其分配给 b.f. 当 b 电话 f,这就等于叫 a.doThing 直接,这可以通过 a.x 事后拥有更新值。这就是所谓的传递一个 回调,这是一个传递给另一个函数或对象的函数,然后可以调用,而不必直接引用传递进来的函数,即 b 可以调用 a.doThing 通过调用回调 f() 而无需明确调用 a.doThing(). (注意:这是对回调的一个非常简单的解释,更详细的解释会涉及到如何实际使用传递的函数的细微差别。)

这不等于说 a.doThing 现在属于 bb 现在并没有神奇地拥有一个 doThing 方法。同样的,当你传入 setValue 到一个无状态的部件,您并没有神奇地赋予该部件一个状态,您也没有因为突然能够调用"setState"的实例,就像你从一个无状态的小组件中传递了一个 State<MyApp> 本身并称 stateObj.setState(...) 直接(当然不是说我建议你这么做)。

© www.soinside.com 2019 - 2024. All rights reserved.