Return 来自函数调用的 Flutter 值

Return Flutter Value from function call

我对在 Firebase 中创建项目的未来进行了以下函数调用,我希望实现的是 return 创建项目后的文档 ID。到目前为止,我可以获得 ID,但我不知道如何 return 将其返回到调用它的小部件。 我应该补充一点,这个功能和未来在 2 个不同的文件中

函数

print("Task Details");
          Task task = Task(
            title: _title,
            desc: _desc,
            ownerId:
                Provider.of<UserData>(context, listen: false).currentUserId,
          );
          // Database update
          DatabaseService.createTask(task);

未来

static Future<void> createTask(Task task) async {
    await tasksRef
        .add({
          'title': task.title,
          'desc': task.desc,
          'budget': task.budget,
          'authorId': task.ownerId,
          'due': task.due,
          'location': task.location,
          'status': 'draft',
          'open': true,
          'timestamp': task.timestamp,
        })
        .then((value) => print("Task Added ${value.id}"))
        .catchError((error) => print("Failed to add task: $error"));
  }

问题不在于获取 ID,而在于它是一个异步操作。你不能return现在还没有确定的东西。

但是因为你已经return一个Future(它封装了一些还不一定发生的事情),你可以return一个Future<String>来捕获文档编号:

static Future<String> createTask(Task task) async {
  var docRef = await tasksRef
    .add({
      'title': task.title,
      'desc': task.desc,
      'budget': task.budget,
      'authorId': task.ownerId,
      'due': task.due,
      'location': task.location,
      'status': 'draft',
      'open': true,
      'timestamp': task.timestamp,
    });
  return docRef.id;
}

然后您可以 await 调用 createTask,或者像您一样使用 then 块。例如:

var newDocId = await DatabaseService.createTask(task);

如果您想在 UI 中显示新文档 ID,您可以在小部件树中使用 FutureBuilderFuture<String> 解包为 String .