使用 Firebase 时出现 Flutter Stackoverflow 错误

Flutter Stackoverflow Error when using Firebase

我不知道这个 Whosebug 错误是从哪里来的

I/flutter (20342): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
    I/flutter (20342): The following WhosebugError was thrown building Analytics(dirty):
    I/flutter (20342): Stack Overflow
    I/flutter (20342):
    I/flutter (20342): The relevant error-causing widget was:
    I/flutter (20342):   Analytics
    I/flutter (20342):   file:///C:/Users/OneDrive/Dokumente/Development/GitHub/trimlog/src/flutter_app/lib/screens/wrapper.dart:87:11
    I/flutter (20342):
    I/flutter (20342): When the exception was thrown, this was the stack:
    I/flutter (20342): #0      _LinkedHashMapMixin._getValueOrData (dart:collection-patch/compact_hash.dart:331:3)
    I/flutter (20342): #1      _LinkedHashMapMixin.containsKey (dart:collection-patch/compact_hash.dart:355:54)
    I/flutter (20342): #2      FirebaseFirestore.instanceFor (package:cloud_firestore/src/firestore.dart:50:26)
    I/flutter (20342): #3      new Database (package:Trimlog/services/database/database.dart:39:97)
    I/flutter (20342): #4      new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #5      new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #6      new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #7      new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #8      new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #9      new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #10     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #11     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #12     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #13     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #14     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #15     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #16     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #17     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #18     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #19     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #20     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #21     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #22     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #23     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #24     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #25     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #26     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #27     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #28     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #29     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #30     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #31     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #32     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #33     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #34     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #35     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #36     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #37     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #38     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #39     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #40     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #41     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #42     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): #43     new Database (package:Trimlog/services/database/database.dart)
    I/flutter (20342): ...
    I/flutter (20342): ...
    I/flutter (20342): #15600  ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4606:5)
    I/flutter (20342): #15601  StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4791:11)
    I/flutter (20342): #15602  ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
    I/flutter (20342): ...     Normal element mounting (7 frames)
    I/flutter (20342): #15609  Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
    I/flutter (20342): #15610  Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
    I/flutter (20342): #15611  SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1158:36)
    I/flutter (20342): #15612  SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1143:20)    
    I/flutter (20342): #15613  BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2683:19)
    I/flutter (20342): #15614  SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1136:11)
    I/flutter (20342): #15615  RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:350:23)
    I/flutter (20342): #15616  RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1883:59)
    I/flutter (20342): #15617  PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:915:15)
    I/flutter (20342): #15618  RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1883:14)
    I/flutter (20342): #15619  RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:339:5)
    I/flutter (20342): #15620  RenderSliverMultiBoxAdaptor.insertAndLayoutChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:485:5)
    I/flutter (20342): #15621  RenderSliverFixedExtentBoxAdaptor.performLayout (package:flutter/src/rendering/sliver_fixed_extent_list.dart:259:17)
    I/flutter (20342): #15622  RenderObject.layout (package:flutter/src/rendering/object.dart:1777:7)
    I/flutter (20342): #15623  RenderSliverEdgeInsetsPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:132:12)
    I/flutter (20342): #15624  _RenderSliverFractionalPadding.performLayout (package:flutter/src/widgets/sliver_fill.dart:170:11)
    I/flutter (20342): #15625  RenderObject.layout (package:flutter/src/rendering/object.dart:1777:7)
    I/flutter (20342): #15626  RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:507:13)
    I/flutter (20342): #15627  RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1561:12)
    I/flutter (20342): #15628  RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1470:20)
    I/flutter (20342): #15629  RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1634:7)
    I/flutter (20342): #15630  PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:884:18)
    I/flutter (20342): #15631  RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:436:19)
    I/flutter (20342): #15632  WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:914:13)
    I/flutter (20342): #15633  RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:302:5)
    I/flutter (20342): #15634  SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1117:15)
    I/flutter (20342): #15635  SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1055:9)
    I/flutter (20342): #15636  SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:971:5)
    I/flutter (20342): #15640  _invoke (dart:ui/hooks.dart:251:10)
    I/flutter (20342): #15641  _drawFrame (dart:ui/hooks.dart:209:3)
    I/flutter (20342): (elided 3 frames from dart:async)
    I/flutter (20342):
    I/flutter (20342): ════════════════════════════════════════════════════════════════════════════════════════════════════
    I/flutter (20342): Another exception was thrown: NoSuchMethodError: The getter 'analytic' was called on null.

在我的main.dart

class Instances {
  static Database database = new Database();
}

在database.dart

class Database {
  final _databaseReference = FirebaseFirestore.instance; // Instance of Firebase
  final user = new DatabaseUser();
  final boat = new DatabaseBoat();
  final trim = new DatabaseTrim();
  final analytic = new DatabaseAnalytic();

在database_analytic.dart

class DatabaseAnalytic extends Database {

我如何访问例如 DatabaseAnalytic

Instances.database.analytic.deleteAnalyticOfBoat(widget.boat.documentid, widget.analytic.documentid)

wrapper.dart: https://hastebin.com/eholocelug.java

谁能告诉我错误是从哪里来的?

我看到它说“getter 'analytic' 被调用为空。”,但我不明白为什么会这样。

我也不确定这是否是使用数据库的最佳方式,如果有更好的方式,请告诉我。

我们可以在您的错误输出中看到这一点

Another exception was thrown: NoSuchMethodError: The getter 'analytic' was called on null.

用这条线

Instances.database.analytic.deleteAnalyticOfBoat(widget.boat.documentid,widget.analytic.documentid)

您的错误假定 Instances.databasenull

如果您查看错误的其余部分,数据库会不断地被一遍又一遍地实例化。数据库正在实例化 DatabaseAnalytic,它再次实例化数据库。这就是导致溢出错误的原因。