Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 带返回值的Dart引用回调_Flutter_Dart - Fatal编程技术网

Flutter 带返回值的Dart引用回调

Flutter 带返回值的Dart引用回调,flutter,dart,Flutter,Dart,我必须在Dart中的回调上返回一个值。现在,当我们使用直接回调时,这样做很简单,但我有另一种情况,我必须使用引用回调。这可能很愚蠢,但我必须这样做 方法1(不工作): import 'dart:async'; main() { TestClass().method2(() => "Returend String"); } class TestClass { String Function() getStringCallback; TestClass() { met

我必须在Dart中的回调上返回一个值。现在,当我们使用直接回调时,这样做很简单,但我有另一种情况,我必须使用引用回调。这可能很愚蠢,但我必须这样做

方法1(不工作):

import 'dart:async';

main() {
  TestClass().method2(() => "Returend String");
}

class TestClass {
  String Function() getStringCallback;

  TestClass() {
    method1();
  }

  void method1() {
    TestClass2(getStringCallback);
  }

  void method2(String Function() callbackString) {
    this.getStringCallback = callbackString;
  }
}

class TestClass2 {
  String Function() getStringCallback;

  TestClass2(this.getStringCallback) {
    Timer(Duration(seconds: 3), () {
      print(getStringCallback.call());
    });
  }
}
import 'dart:async';

main() {
  TestClass().method2("Returend String");
}

class TestClass {
  String getStringCallback;

  TestClass() {
    method1();
  }

  void method1() {
    TestClass2(()=>getStringCallback);
  }

  void method2(String callbackString) {
    this.getStringCallback = callbackString;
  }
}

class TestClass2 {
  String Function() getStringCallback;

  TestClass2(this.getStringCallback) {
    Timer(Duration(seconds: 3), () {
      print(getStringCallback.call());
    });
  }
}
上述代码导致错误,因为
getStringCallback
为空

TestClass2正在通过
method1
实例化,因此可以在那里执行此操作。是否可以通过
方法2
执行此操作

目前,我正在这样做

方法2(按预期工作):

import 'dart:async';

main() {
  TestClass().method2(() => "Returend String");
}

class TestClass {
  String Function() getStringCallback;

  TestClass() {
    method1();
  }

  void method1() {
    TestClass2(getStringCallback);
  }

  void method2(String Function() callbackString) {
    this.getStringCallback = callbackString;
  }
}

class TestClass2 {
  String Function() getStringCallback;

  TestClass2(this.getStringCallback) {
    Timer(Duration(seconds: 3), () {
      print(getStringCallback.call());
    });
  }
}
import 'dart:async';

main() {
  TestClass().method2("Returend String");
}

class TestClass {
  String getStringCallback;

  TestClass() {
    method1();
  }

  void method1() {
    TestClass2(()=>getStringCallback);
  }

  void method2(String callbackString) {
    this.getStringCallback = callbackString;
  }
}

class TestClass2 {
  String Function() getStringCallback;

  TestClass2(this.getStringCallback) {
    Timer(Duration(seconds: 3), () {
      print(getStringCallback.call());
    });
  }
}

我想用方法1来做。可能吗?

您可以使用一个函数包装回调,该函数可以在分配新回调时更改其行为。替换TestClass2(getStringCallback)带有
TestClass2(()=>getStringCallback())

方法1不起作用,因为在
method2
之前调用了
method1

遵循main上的逻辑:

调用
TestClass()
时,它调用类的构造函数,在
TestClass的构造函数中调用
method1
。调用构造后,调用
method2
,因此在您的逻辑中:

main(){
TestClass().method2(()=>“Returend字符串”);
//这里您调用construct,构造函数调用method1
}
main(){
TestClass().method2(()=>“Returend字符串”);
//这里您在调用method1之后调用method2
}
我希望你能理解我的英语