【问题标题】:Extend a Widget called from another file扩展从另一个文件调用的 Widget
【发布时间】:2021-04-25 05:11:37
【问题描述】:

大家晚上好,实际上我创建了一个文件,其中包含一些基于 firestore 的函数,我必须在其他文件中重用这些函数,代码如下:

import 'dart:math';
import 'dart:async';
import 'package:cron/cron.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:provider/provider.dart';
import 'package:goodgoals_android/services/authentication.dart';

abstract class Service {
  Future<void> NumberGenerator();

  Future<void> MissionRetriever1();

  Future<void> MissionRetriever2();

  Future<void> MissionRetriever3();

  Future<void> MissionRetriever4();

}

class MissionService implements Service {
  MissionService({this.auth});
  int missionNumber1;
  int missionNumber2;
  int missionNumber3;
  int missionNumber4;
  int test = 10;
  final BaseAuth auth;
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
  final databaseReference = FirebaseFirestore.instance;



  Future<void> NumberGenerator() {
    final cron= Cron();
    cron.schedule(Schedule.parse('*0**1'), () async { //Tutti i Lunedì alle 00;
    Random random = new Random();
    missionNumber1 = random.nextInt(10);
    missionNumber2 = random.nextInt(10);
    missionNumber3 = random.nextInt(10);
    missionNumber4 = random.nextInt(10);
  });
  }


  Future<void> MissionRetriever1() async{
    await FirebaseFirestore.instance
        .collection("quest")
        .doc("1")
        .get();
    }

  Future<void> MissionRetriever2() async{
    return await FirebaseFirestore.instance
        .collection("quest")
        .doc(missionNumber2.toString())
        .get();
  }

  Future<void> MissionRetriever3() async{
    return await FirebaseFirestore.instance
        .collection("quest")
        .doc(missionNumber3.toString())
        .get();
  }

  Future<void> MissionRetriever4() async{
    return await FirebaseFirestore.instance
        .collection("quest")
        .doc(missionNumber4.toString())
        .get();
  }




  }

在实践中,我需要在另一个文件中调用 MissionRetriever1 函数,然后使用 then 保存值,如下所示:

  Future<void> getMission1() async{
    return await widget.mservice.MissionRetriever2
        .then((QuerySnapshot querySnapshot) => {
      querySnapshot.docs.forEach((doc) {
        print("Done");
        setState(() {
          MissionData1.add(doc["Name"]);
        });
      }),
    });
  }

但是这样做会给我一个错误:方法“then”没有为类型“Function”定义。

有什么建议吗?

【问题讨论】:

  • 你不能awaitthen 在同一个组合中使用。您可以await 并分配值,或者使用then 并在未来发出事件时获得回调。
  • 我已经尝试用 .then 删除函数中的等待,但错误仍然存​​在
  • 它应该是widget.mservice.MissionRetriever2() 因为这是一个函数调用而不是实例成员。另外一个友好的建议是查看 dart 的命名约定,它们将使您的代码更具可读性。
  • 非常感谢您提供的提高可读性的建议,如果我在调用小部件时添加 () 会出现这个问题,我会收到这个新错误:参数类型 'Set Function(QuerySnapshot )' 不能分配给参数类型'FutureOr Function(void)'。

标签: flutter google-cloud-firestore flutter-layout flutter-dependencies flutter-test


【解决方案1】:

您在 MissionRetriever2 之后缺少 ()。您的 IDE 可能没有警告您,因为您的所有都是大写字母,这是类名的标准,但不是函数。函数应遵循驼峰式 ex:missionRetriever2

Future<void> getMission1() async{
    return await widget.mservice.MissionRetriever2()
        .then((QuerySnapshot querySnapshot) => {
      querySnapshot.docs.forEach((doc) {
        print("Done");
        setState(() {
          MissionData1.add(doc["Name"]);
        });
      }),
    });
    }

请注意,您也不需要结合使用 await 和 .then() 回调,更简洁的方法是:

Future<void> getMission1() async{
    var snap = await widget.mService.missionRetriever2();
    for(var doc in snap.docs){
        missionData1.add(doc.data()['Name']);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2014-02-23
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多