使用 Firebase 时出现 Flutter Stackoverflow 错误

问题描述

我不知道这个 Stackoverflow 错误来自哪里

I/Flutter (20342): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
    I/Flutter (20342): The following StackOverflowError 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/Florian%20Rachmann/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

谁能告诉我错误来自哪里?

我已经看到,它说“在 null 上调用了 getter 'analytic'。”,但我不知道为什么会这样。

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

解决方法

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

引发了另一个异常:NoSuchMethodError:在 null 上调用了 getter 'analytic'。

有了这条线

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

您的错误假设 Instances.databasenull

,

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