Flutter 将 num 与来自 Firebase 的 dynamic 进行比较

Flutter compare num with dynamic from Firebase

我想通过 Firebase Firestore 手动比较应用程序的版本。在 Firestore 中,我有一个集合(系统)和一个带有字段的文档(更新):newest_v_app = number 7。我想在我的应用程序的页面上访问这个字段,并想将它与一个数字进行比较。如果 firestore 中的数字高于应用程序中的数字,我想要一个 bool 设置为 true。

我试过的代码(解释我的意思):

UpdatePage.dart

class UpdatePage extends StatefulWidget {

  @override
  _UpdatePageState createState() => _UpdatePageState();
}

class _UpdatePageState extends State<UpdatePage> {

  bool update_available = false;

  num current_version = 7;
  dynamic newest_version_from_firebase = 7;

  Future<dynamic> _getUpdateAvailable() async {
    final DocumentReference document = FirebaseFirestore.instance.collection('system').doc('update');
    print('Success GetUpdate 1');
    await document.get().then<dynamic>((DocumentSnapshot snapshot) async {
      setState(() {
        newest_version_from_firebase = snapshot.data;
      });
    });
    print('Success GetUpdate 2');
    compareUpdate(context);
    print('Success GetUpdate 3');
    testUpdateComparer();
  }

  void compareUpdate(BuildContext context) {
    if (newest_version_from_firebase > current_version) {
      setState(() {
        update_available = true;
      });
    } else {
      setState(() {
        update_available = false;
      });
    }
  }

  void testUpdateComparer() {
    if (update_available == true) {
      print('Success AvailableBool');
    } else {
      print('No AvailableBool');
    }
  }

  @override
  void initState() {
    super.initState();
    print('Success Init');
    _getUpdateAvailable();
  }

  @override
  Widget build(BuildContext context) {
    Size size = MediaQuery.of(context).size;
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
    ]);
    return Scaffold(
    );
  }
}

控制台和错误:

I/flutter (15814): Success Init
I/flutter (15814): Success GetUpdate 1
W/DynamiteModule(15814): Local module descriptor class for providerinstaller not found.
I/DynamiteModule(15814): Considering local module providerinstaller:0 and remote module providerinstaller:0
W/ProviderInstaller(15814): Failed to load providerinstaller module: No acceptable module found. Local version is 0 and remote version is 0.
I/flutter (15814): Success GetUpdate 2
I/flutter (15814): No AvailableBool
E/flutter (15814): [ERROR:flutter/lib/ui/ui_dart_state.cc(213)] Unhandled Exception: NoSuchMethodError: Closure call with mismatched arguments: function '>'
E/flutter (15814): Receiver: Closure: () => Map<String, dynamic>? from Function 'data':.
E/flutter (15814): Tried calling: >(7)
E/flutter (15814): Found: >() => Map<String, dynamic>?
E/flutter (15814): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:63:5)
E/flutter (15814): #1      _UpdatePageState.compareUpdate (package:myapp/UpdatePage/UpdatePage.dart:44:38)
E/flutter (15814): #2      _UpdatePageState._getUpdateAvailable (package:myapp/UpdatePage/UpdatePage.dart:38:5)
E/flutter (15814): <asynchronous suspension>
E/flutter (15814): 


Flutter 2.3.0-17.0.pre.19 • channel master • https://github.com/flutter/flutter.git
Framework • revision bcf05f4587 (4 months ago) • 2021-05-23 02:19:02 -0400
Engine • revision 8cd4cf0a67
Tools • Dart 2.14.0 (build 2.14.0-143.0.dev)

来自 firestore 的 snapshot.data returns a Map<String, dynamic> 并且您正试图将其分配给变量 newest_version_from_firebase,您正试图将其用作 ,这是不可能的。

snaposhot.data returns a Document 其中您的版本号可能存储为键值对,例如:{"versionNumber": 7}

访问它你应该做的,例如:

newest_version_from_firebase = snapshot.data["versionNumber"] as int;

已解决:

已将 num 更改为 int

late DocumentSnapshot snapshot;

int current_version = 7;
  int newest_version_from_firebase = 7;

void getUpdateAvailable() async {
    final data = await FirebaseFirestore.instance.collection("system").doc("update").get() as DocumentSnapshot;
    snapshot = data as DocumentSnapshot;
    setState(() {
      newest_version_from_firebase = snapshot["newest_version"] as int;
    });
    print(newest_version_from_firebase.toString());
    compareUpdate(context);
  }