Coder Social home page Coder Social logo

mobxjs / mobx.dart Goto Github PK

View Code? Open in Web Editor NEW
2.4K 2.4K 304.0 23.97 MB

MobX for the Dart language. Hassle-free, reactive state-management for your Dart and Flutter apps.

Home Page: https://mobx.netlify.app

License: MIT License

Dart 99.91% Shell 0.09%
dart dart-language flutter mobx pub reactive state-management

mobx.dart's People

Contributors

adiakhaitan avatar allcontributors[bot] avatar altynbek132 avatar amondnet avatar ascenio avatar brianrobles204 avatar chimon2000 avatar davidmartos96 avatar dependabot[bot] avatar dmalbuquerque avatar eltociear avatar fzyzcjy avatar geisterfurz007 avatar hawkbee1 avatar hmayer00 avatar jacobaraujo7 avatar jeuler avatar joshuadeguzman avatar k-paxian avatar katis avatar leonardocustodio avatar lsaudon avatar maikub avatar marcoms avatar pavanpodila avatar pedromassango avatar pr-1 avatar rrousselgit avatar shyndman avatar subzero911 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mobx.dart's Issues

Generate all.dart for tests

From a discussion with @katis on a closed PR.

I removed all.dart files for flutter tests on #43 as it seemed unneeded while causing maintenance issues (easy to not update it).

But @katis said:

test_coverage generates it's own combined file. I've used the all.dart to run all unit tests with a single Dart VM launch which usually makes them run faster than every file opening their own separate VM.

In that case maybe we should ask test_coverage to extract the generator so that we can use it to generate all.dart.

If all.dart is generated, this would allow using buid_test, which makes a failing test if anything on the project haven't been generated.
This would prevent from adding tests without updating the all.dart

Reduce the use of global state [Suggestion]

Currently the ctx global variable is used all around the codebase, which follows the design of the JS version.

To make testing easier and to make the code more "Darty", maybe the ReactiveContext should be passed as a parameter to the classes that use it. Only builder functions/factories would access the global context.

Could also look into using Zone specific data for the context. Zone is kinda like ThreadLocal in Java. Might also help in making testing tools etc. in the future.

Multiple store files causes codegen to fail

I've got a new app that is essentially almost identical to the Todos app, but instead (with Activity instead of Todo, and ActivityList instead of TodoList). The key difference is that I've split out Activity into it's own activity.dart, so I have two store .dart files (and should get corresponding .g.dart files). And in fact, @pavanpodila tried this and experienced the same issues. His split of it for the Todo app is here: https://github.com/mobxjs/mobx.dart/tree/master/flutter_mobx/example.

The problem is, when I run the code gen (i.e. flutter packages pub run build_runner build), it fails. If I combine the two files (putting the activity.dart code back into activity_list.dart), codegen runs with no errors. Also, it just fails on the activity_list.dart, it successfully runs for activity.dart (producing activity.g.dart).

I'm on MacBook Pro, macOS 10.14.2, with latest Flutter (1.0.0) and latest mobx (0.0.36) and flutter_mobx (0.0.10), and build_runner 1.1.3 (mobx wont' let me use a newer one, and this might be something of interest as I saw another thread showing this same "Cannot compute LIBRARY_ELEMENT" error, saying the analyzer was having trouble with some newer syntax? My repo isn't public, but let me know if I can provide any other info.

Here's the output with errors (sorry it's so long, but I didn't want to remove anything in case that helps shed light on it):

➜ flutter packages pub run build_runner build

[INFO] Generating build script...
[INFO] Generating build script completed, took 263ms

[INFO] Initializing inputs
[INFO] Reading cached asset graph...
[INFO] Reading cached asset graph completed, took 116ms

[INFO] Checking for updates since last build...
[INFO] Checking for updates since last build completed, took 671ms

[INFO] Running build...
[SEVERE] mobx_codegen|mobx_generator on lib/stores/activity_list.dart:

AnalysisException: Cannot compute LIBRARY_ELEMENT for Instance of 'AssetBasedSource'
Caused by Unexpected exception while performing ResolveUnitTypeNamesTask for source myapp|lib/stores/activity_list.dart
#0      AnalysisTask._safelyPerform (package:analyzer/src/task/api/model.dart:353:7)
#1      AnalysisTask.perform (package:analyzer/src/task/api/model.dart:240:7)
#2      AnalysisDriver.performWorkItem (package:analyzer/src/task/driver.dart:285:10)
#3      AnalysisDriver.computeResult (package:analyzer/src/task/driver.dart:110:22)
#4      AnalysisContextImpl.computeResult (package:analyzer/src/context/context.dart:654:14)
#5      AnalysisContextImpl.computeLibraryElement (package:analyzer/src/context/context.dart:622:12)
#6      AnalyzerResolver.libraryFor (package:build_resolvers/src/resolver.dart:114:21)
<asynchronous suspension>
#7      PerActionResolver.libraryFor (package:build_resolvers/src/resolver.dart:65:17)
#8      _DelayedResolver.libraryFor (package:build/src/builder/build_step_impl.dart:192:25)
<asynchronous suspension>
#9      BuildStepImpl.inputLibrary (package:build/src/builder/build_step_impl.dart:37:21)
<asynchronous suspension>
#10     _Builder.build (package:source_gen/src/builder.dart:65:31)
<asynchronous suspension>
#11     runBuilder.buildForInput (package:build/src/generate/run_builder.dart:45:21)
<asynchronous suspension>
#12     MappedListIterable.elementAt (dart:_internal/iterable.dart:414:29)
#13     ListIterator.moveNext (dart:_internal/iterable.dart:343:26)
#14     Future.wait (dart:async/future.dart:392:26)
#15     runBuilder.<anonymous closure> (package:build/src/generate/run_builder.dart:51:36)
#16     _rootRun (dart:async/zone.dart:1124:13)
#17     _CustomZone.run (dart:async/zone.dart:1021:19)
#18     _runZoned (dart:async/zone.dart:1516:10)
#19     runZoned (dart:async/zone.dart:1500:12)
#20     scopeLogAsync (package:build/src/builder/logging.dart:22:3)
#21     runBuilder (package:build/src/generate/run_builder.dart:51:9)
<asynchronous suspension>
#22     _SingleBuild._runForInput.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:455:19)
#23     _NoOpBuilderActionTracker.trackStage (package:build_runner_core/src/generate/performance_tracker.dart:303:15)
#24     _SingleBuild._runForInput.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:453:23)
<asynchronous suspension>
#25     NoOpTimeTracker.track (package:timing/src/timing.dart:222:44)
#26     _SingleBuild._runForInput.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:412:22)
#27     Pool.withResource (package:pool/pool.dart:127:28)
<asynchronous suspension>
#28     _SingleBuild._runForInput (package:build_runner_core/src/generate/build_impl.dart:408:17)
#29     _SingleBuild._runBuilder.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:358:38)
#30     MappedIterator.moveNext (dart:_internal/iterable.dart:392:18)
#31     Future.wait (dart:async/future.dart:392:26)
#32     _SingleBuild._runBuilder (package:build_runner_core/src/generate/build_impl.dart:357:36)
#33     _AsyncAwaitCompleter.start (dart:async/runtime/libasync_patch.dart:49:6)
#34     _SingleBuild._runBuilder (package:build_runner_core/src/generate/build_impl.dart:355:40)
#35     _SingleBuild._runPhases.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:304:20)
#36     _asyncThenWrapperHelper.<anonymous closure> (dart:async/runtime/libasync_patch.dart:77:64)
#37     _rootRunUnary (dart:async/zone.dart:1132:38)
#38     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#39     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#40     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#41     Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#42     Future._complete (dart:async/future_impl.dart:476:7)
#43     _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#44     _AsyncAwaitCompleter.complete (dart:async/runtime/libasync_patch.dart:28:18)
#45     _completeOnAsyncReturn (dart:async/runtime/libasync_patch.dart:295:13)
#46     _SingleBuild._matchingPrimaryInputs (package:build_runner_core/src/generate/build_impl.dart)
#47     _asyncThenWrapperHelper.<anonymous closure> (dart:async/runtime/libasync_patch.dart:77:64)
#48     _rootRunUnary (dart:async/zone.dart:1132:38)
#49     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#50     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#51     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#52     Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#53     Future._completeWithValue (dart:async/future_impl.dart:486:5)
#54     Future.wait.<anonymous closure> (dart:async/future.dart:399:22)
#55     _rootRunUnary (dart:async/zone.dart:1132:38)
#56     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#57     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#58     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#59     Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#60     Future._complete (dart:async/future_impl.dart:476:7)
#61     _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#62     _AsyncAwaitCompleter.complete.<anonymous closure> (dart:async/runtime/libasync_patch.dart:33:20)
#63     _rootRun (dart:async/zone.dart:1120:38)
#64     _CustomZone.run (dart:async/zone.dart:1021:19)
#65     _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#66     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
#67     _rootRun (dart:async/zone.dart:1124:13)
#68     _CustomZone.run (dart:async/zone.dart:1021:19)
#69     _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#70     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
#71     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#72     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#73     _runPendingImmediateCallback (dart:isolate/runtime/libisolate_patch.dart:115:13)
#74     _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:172:5)

Caused by NoSuchMethodError: The getter 'typeParameters' was called on null.
Receiver: null
Tried calling: typeParameters
#0      Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
#1      ClassElementImpl._computeMixinAppConstructors (package:analyzer/src/dart/element/element.dart:1100:50)
#2      ClassElementImpl.constructors (package:analyzer/src/dart/element/element.dart:518:30)
#3      ClassElementImpl.unnamedConstructor (package:analyzer/src/dart/element/element.dart:949:40)
#4      InterfaceTypeImpl.lookUpConstructor (package:analyzer/src/dart/element/type.dart:1881:36)
#5      AstRewriteVisitor.visitMethodInvocation (package:analyzer/src/generated/resolver.dart:92:18)
#6      MethodInvocationImpl.accept (package:analyzer/src/dart/ast/ast.dart:8679:49)
#7      VariableDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:12442:19)
#8      UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#9      UnifyingAstVisitor.visitVariableDeclaration (package:analyzer/dart/ast/visitor.dart:3555:59)
#10     ScopedVisitor.visitVariableDeclaration (package:analyzer/src/generated/resolver.dart:6704:11)
#11     VariableDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:12436:49)
#12     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:9174:20)
#13     VariableDeclarationListImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:12538:16)
#14     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#15     UnifyingAstVisitor.visitVariableDeclarationList (package:analyzer/dart/ast/visitor.dart:3559:7)
#16     VariableDeclarationListImpl.accept (package:analyzer/src/dart/ast/ast.dart:12532:15)
#17     VariableDeclarationStatementImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:12593:20)
#18     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#19     UnifyingAstVisitor.visitVariableDeclarationStatement (package:analyzer/dart/ast/visitor.dart:3563:7)
#20     VariableDeclarationStatementImpl.accept (package:analyzer/src/dart/ast/ast.dart:12589:15)
#21     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:9174:20)
#22     BlockImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:1254:17)
#23     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#24     UnifyingAstVisitor.visitBlock (package:analyzer/dart/ast/visitor.dart:3199:31)
#25     ScopedVisitor.visitBlock (package:analyzer/src/generated/resolver.dart:6141:13)
#26     BlockImpl.accept (package:analyzer/src/dart/ast/ast.dart:1250:49)
#27     BlockFunctionBodyImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:1199:13)
#28     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#29     UnifyingAstVisitor.visitBlockFunctionBody (package:analyzer/dart/ast/visitor.dart:3202:55)
#30     ScopedVisitor.visitBlockFunctionBody (package:analyzer/src/generated/resolver.dart:6152:13)
#31     BlockFunctionBodyImpl.accept (package:analyzer/src/dart/ast/ast.dart:1195:49)
#32     MethodDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:8541:12)
#33     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#34     UnifyingAstVisitor.visitMethodDeclaration (package:analyzer/dart/ast/visitor.dart:3422:55)
#35     ScopedVisitor.visitMethodDeclarationInScope (package:analyzer/src/generated/resolver.dart:6597:11)
#36     ScopedVisitor.visitMethodDeclaration (package:analyzer/src/generated/resolver.dart:6590:7)
#37     MethodDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:8532:49)
#38     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:9174:20)
#39     ScopedVisitor.visitClassMembersInScope (package:analyzer/src/generated/resolver.dart:6218:18)
#40     ScopedVisitor.visitClassDeclaration (package:analyzer/src/generated/resolver.dart:6196:11)
#41     ClassDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:1765:49)
#42     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:9174:20)
#43     CompilationUnitImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:2567:21)
#44     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#45     UnifyingAstVisitor.visitCompilationUnit (package:analyzer/dart/ast/visitor.dart:3235:51)
#46     CompilationUnitImpl.accept (package:analyzer/src/dart/ast/ast.dart:2560:49)
#47     ResolveUnitTypeNamesTask.internalPerform (package:analyzer/src/task/dart.dart:5133:10)
#48     AnalysisTask._safelyPerform (package:analyzer/src/task/api/model.dart:341:9)
#49     AnalysisTask.perform (package:analyzer/src/task/api/model.dart:240:7)
#50     AnalysisDriver.performWorkItem (package:analyzer/src/task/driver.dart:285:10)
#51     AnalysisDriver.computeResult (package:analyzer/src/task/driver.dart:110:22)
#52     AnalysisContextImpl.computeResult (package:analyzer/src/context/context.dart:654:14)
#53     AnalysisContextImpl.computeLibraryElement (package:analyzer/src/context/context.dart:622:12)
#54     AnalyzerResolver.libraryFor (package:build_resolvers/src/resolver.dart:114:21)
<asynchronous suspension>
#55     PerActionResolver.libraryFor (package:build_resolvers/src/resolver.dart:65:17)
#56     _DelayedResolver.libraryFor (package:build/src/builder/build_step_impl.dart:192:25)
<asynchronous suspension>
#57     BuildStepImpl.inputLibrary (package:build/src/builder/build_step_impl.dart:37:21)
<asynchronous suspension>
#58     _Builder.build (package:source_gen/src/builder.dart:65:31)
<asynchronous suspension>
#59     runBuilder.buildForInput (package:build/src/generate/run_builder.dart:45:21)
<asynchronous suspension>
#60     MappedListIterable.elementAt (dart:_internal/iterable.dart:414:29)
#61     ListIterator.moveNext (dart:_internal/iterable.dart:343:26)
#62     Future.wait (dart:async/future.dart:392:26)
#63     runBuilder.<anonymous closure> (package:build/src/generate/run_builder.dart:51:36)
#64     _rootRun (dart:async/zone.dart:1124:13)
#65     _CustomZone.run (dart:async/zone.dart:1021:19)
#66     _runZoned (dart:async/zone.dart:1516:10)
#67     runZoned (dart:async/zone.dart:1500:12)
#68     scopeLogAsync (package:build/src/builder/logging.dart:22:3)
#69     runBuilder (package:build/src/generate/run_builder.dart:51:9)
<asynchronous suspension>
#70     _SingleBuild._runForInput.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:455:19)
#71     _NoOpBuilderActionTracker.trackStage (package:build_runner_core/src/generate/performance_tracker.dart:303:15)
#72     _SingleBuild._runForInput.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:453:23)
<asynchronous suspension>
#73     NoOpTimeTracker.track (package:timing/src/timing.dart:222:44)
#74     _SingleBuild._runForInput.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:412:22)
#75     Pool.withResource (package:pool/pool.dart:127:28)
<asynchronous suspension>
#76     _SingleBuild._runForInput (package:build_runner_core/src/generate/build_impl.dart:408:17)
#77     _SingleBuild._runBuilder.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:358:38)
#78     MappedIterator.moveNext (dart:_internal/iterable.dart:392:18)
#79     Future.wait (dart:async/future.dart:392:26)
#80     _SingleBuild._runBuilder (package:build_runner_core/src/generate/build_impl.dart:357:36)
#81     _AsyncAwaitCompleter.start (dart:async/runtime/libasync_patch.dart:49:6)
#82     _SingleBuild._runBuilder (package:build_runner_core/src/generate/build_impl.dart:355:40)
#83     _SingleBuild._runPhases.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:304:20)
#84     _asyncThenWrapperHelper.<anonymous closure> (dart:async/runtime/libasync_patch.dart:77:64)
#85     _rootRunUnary (dart:async/zone.dart:1132:38)
#86     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#87     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#88     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#89     Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#90     Future._complete (dart:async/future_impl.dart:476:7)
#91     _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#92     _AsyncAwaitCompleter.complete (dart:async/runtime/libasync_patch.dart:28:18)
#93     _completeOnAsyncReturn (dart:async/runtime/libasync_patch.dart:295:13)
#94     _SingleBuild._matchingPrimaryInputs (package:build_runner_core/src/generate/build_impl.dart)
#95     _asyncThenWrapperHelper.<anonymous closure> (dart:async/runtime/libasync_patch.dart:77:64)
#96     _rootRunUnary (dart:async/zone.dart:1132:38)
#97     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#98     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#99     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#100    Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#101    Future._completeWithValue (dart:async/future_impl.dart:486:5)
#102    Future.wait.<anonymous closure> (dart:async/future.dart:399:22)
#103    _rootRunUnary (dart:async/zone.dart:1132:38)
#104    _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#105    _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#106    Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#107    Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#108    Future._complete (dart:async/future_impl.dart:476:7)
#109    _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#110    _AsyncAwaitCompleter.complete.<anonymous closure> (dart:async/runtime/libasync_patch.dart:33:20)
#111    _rootRun (dart:async/zone.dart:1120:38)
#112    _CustomZone.run (dart:async/zone.dart:1021:19)
#113    _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#114    _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
#115    _rootRun (dart:async/zone.dart:1124:13)
#116    _CustomZone.run (dart:async/zone.dart:1021:19)
#117    _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#118    _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
#119    _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#120    _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#121    _runPendingImmediateCallback (dart:isolate/runtime/libisolate_patch.dart:115:13)
#122    _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:172:5)


[SEVERE] mobx_codegen|mobx_generator on lib/main.dart:

AnalysisException: Cannot compute LIBRARY_ELEMENT for Instance of 'AssetBasedSource'
Caused by Unexpected exception while performing ResolveUnitTypeNamesTask for source myapp|lib/stores/activity_list.dart
#0      AnalysisTask._safelyPerform (package:analyzer/src/task/api/model.dart:353:7)
#1      AnalysisTask.perform (package:analyzer/src/task/api/model.dart:240:7)
#2      AnalysisDriver.performWorkItem (package:analyzer/src/task/driver.dart:285:10)
#3      AnalysisDriver.computeResult (package:analyzer/src/task/driver.dart:110:22)
#4      AnalysisContextImpl.computeResult (package:analyzer/src/context/context.dart:654:14)
#5      AnalysisContextImpl.computeLibraryElement (package:analyzer/src/context/context.dart:622:12)
#6      AnalyzerResolver.libraryFor (package:build_resolvers/src/resolver.dart:114:21)
<asynchronous suspension>
#7      PerActionResolver.libraryFor (package:build_resolvers/src/resolver.dart:65:17)
#8      _DelayedResolver.libraryFor (package:build/src/builder/build_step_impl.dart:192:25)
<asynchronous suspension>
#9      BuildStepImpl.inputLibrary (package:build/src/builder/build_step_impl.dart:37:21)
<asynchronous suspension>
#10     _Builder.build (package:source_gen/src/builder.dart:65:31)
<asynchronous suspension>
#11     runBuilder.buildForInput (package:build/src/generate/run_builder.dart:45:21)
<asynchronous suspension>
#12     MappedListIterable.elementAt (dart:_internal/iterable.dart:414:29)
#13     ListIterator.moveNext (dart:_internal/iterable.dart:343:26)
#14     Future.wait (dart:async/future.dart:392:26)
#15     runBuilder.<anonymous closure> (package:build/src/generate/run_builder.dart:51:36)
#16     _rootRun (dart:async/zone.dart:1124:13)
#17     _CustomZone.run (dart:async/zone.dart:1021:19)
#18     _runZoned (dart:async/zone.dart:1516:10)
#19     runZoned (dart:async/zone.dart:1500:12)
#20     scopeLogAsync (package:build/src/builder/logging.dart:22:3)
#21     runBuilder (package:build/src/generate/run_builder.dart:51:9)
<asynchronous suspension>
#22     _SingleBuild._runForInput.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:455:19)
#23     _NoOpBuilderActionTracker.trackStage (package:build_runner_core/src/generate/performance_tracker.dart:303:15)
#24     _SingleBuild._runForInput.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:453:23)
<asynchronous suspension>
#25     NoOpTimeTracker.track (package:timing/src/timing.dart:222:44)
#26     _SingleBuild._runForInput.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:412:22)
#27     Pool.withResource (package:pool/pool.dart:127:28)
<asynchronous suspension>
#28     _SingleBuild._runForInput (package:build_runner_core/src/generate/build_impl.dart:408:17)
#29     _SingleBuild._runBuilder.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:358:38)
#30     MappedIterator.moveNext (dart:_internal/iterable.dart:392:18)
#31     Future.wait (dart:async/future.dart:392:26)
#32     _SingleBuild._runBuilder (package:build_runner_core/src/generate/build_impl.dart:357:36)
#33     _AsyncAwaitCompleter.start (dart:async/runtime/libasync_patch.dart:49:6)
#34     _SingleBuild._runBuilder (package:build_runner_core/src/generate/build_impl.dart:355:40)
#35     _SingleBuild._runPhases.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:304:20)
#36     _asyncThenWrapperHelper.<anonymous closure> (dart:async/runtime/libasync_patch.dart:77:64)
#37     _rootRunUnary (dart:async/zone.dart:1132:38)
#38     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#39     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#40     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#41     Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#42     Future._complete (dart:async/future_impl.dart:476:7)
#43     _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#44     _AsyncAwaitCompleter.complete (dart:async/runtime/libasync_patch.dart:28:18)
#45     _completeOnAsyncReturn (dart:async/runtime/libasync_patch.dart:295:13)
#46     _SingleBuild._matchingPrimaryInputs (package:build_runner_core/src/generate/build_impl.dart)
#47     _asyncThenWrapperHelper.<anonymous closure> (dart:async/runtime/libasync_patch.dart:77:64)
#48     _rootRunUnary (dart:async/zone.dart:1132:38)
#49     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#50     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#51     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#52     Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#53     Future._completeWithValue (dart:async/future_impl.dart:486:5)
#54     Future.wait.<anonymous closure> (dart:async/future.dart:399:22)
#55     _rootRunUnary (dart:async/zone.dart:1132:38)
#56     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#57     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#58     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#59     Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#60     Future._complete (dart:async/future_impl.dart:476:7)
#61     _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#62     _AsyncAwaitCompleter.complete.<anonymous closure> (dart:async/runtime/libasync_patch.dart:33:20)
#63     _rootRun (dart:async/zone.dart:1120:38)
#64     _CustomZone.run (dart:async/zone.dart:1021:19)
#65     _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#66     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
#67     _rootRun (dart:async/zone.dart:1124:13)
#68     _CustomZone.run (dart:async/zone.dart:1021:19)
#69     _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#70     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
#71     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#72     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#73     _runPendingImmediateCallback (dart:isolate/runtime/libisolate_patch.dart:115:13)
#74     _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:172:5)

Caused by NoSuchMethodError: The getter 'typeParameters' was called on null.
Receiver: null
Tried calling: typeParameters
#0      Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
#1      ClassElementImpl._computeMixinAppConstructors (package:analyzer/src/dart/element/element.dart:1100:50)
#2      ClassElementImpl.constructors (package:analyzer/src/dart/element/element.dart:518:30)
#3      ClassElementImpl.unnamedConstructor (package:analyzer/src/dart/element/element.dart:949:40)
#4      InterfaceTypeImpl.lookUpConstructor (package:analyzer/src/dart/element/type.dart:1881:36)
#5      AstRewriteVisitor.visitMethodInvocation (package:analyzer/src/generated/resolver.dart:92:18)
#6      MethodInvocationImpl.accept (package:analyzer/src/dart/ast/ast.dart:8679:49)
#7      VariableDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:12442:19)
#8      UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#9      UnifyingAstVisitor.visitVariableDeclaration (package:analyzer/dart/ast/visitor.dart:3555:59)
#10     ScopedVisitor.visitVariableDeclaration (package:analyzer/src/generated/resolver.dart:6704:11)
#11     VariableDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:12436:49)
#12     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:9174:20)
#13     VariableDeclarationListImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:12538:16)
#14     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#15     UnifyingAstVisitor.visitVariableDeclarationList (package:analyzer/dart/ast/visitor.dart:3559:7)
#16     VariableDeclarationListImpl.accept (package:analyzer/src/dart/ast/ast.dart:12532:15)
#17     VariableDeclarationStatementImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:12593:20)
#18     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#19     UnifyingAstVisitor.visitVariableDeclarationStatement (package:analyzer/dart/ast/visitor.dart:3563:7)
#20     VariableDeclarationStatementImpl.accept (package:analyzer/src/dart/ast/ast.dart:12589:15)
#21     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:9174:20)
#22     BlockImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:1254:17)
#23     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#24     UnifyingAstVisitor.visitBlock (package:analyzer/dart/ast/visitor.dart:3199:31)
#25     ScopedVisitor.visitBlock (package:analyzer/src/generated/resolver.dart:6141:13)
#26     BlockImpl.accept (package:analyzer/src/dart/ast/ast.dart:1250:49)
#27     BlockFunctionBodyImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:1199:13)
#28     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#29     UnifyingAstVisitor.visitBlockFunctionBody (package:analyzer/dart/ast/visitor.dart:3202:55)
#30     ScopedVisitor.visitBlockFunctionBody (package:analyzer/src/generated/resolver.dart:6152:13)
#31     BlockFunctionBodyImpl.accept (package:analyzer/src/dart/ast/ast.dart:1195:49)
#32     MethodDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:8541:12)
#33     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#34     UnifyingAstVisitor.visitMethodDeclaration (package:analyzer/dart/ast/visitor.dart:3422:55)
#35     ScopedVisitor.visitMethodDeclarationInScope (package:analyzer/src/generated/resolver.dart:6597:11)
#36     ScopedVisitor.visitMethodDeclaration (package:analyzer/src/generated/resolver.dart:6590:7)
#37     MethodDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:8532:49)
#38     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:9174:20)
#39     ScopedVisitor.visitClassMembersInScope (package:analyzer/src/generated/resolver.dart:6218:18)
#40     ScopedVisitor.visitClassDeclaration (package:analyzer/src/generated/resolver.dart:6196:11)
#41     ClassDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:1765:49)
#42     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:9174:20)
#43     CompilationUnitImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:2567:21)
#44     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#45     UnifyingAstVisitor.visitCompilationUnit (package:analyzer/dart/ast/visitor.dart:3235:51)
#46     CompilationUnitImpl.accept (package:analyzer/src/dart/ast/ast.dart:2560:49)
#47     ResolveUnitTypeNamesTask.internalPerform (package:analyzer/src/task/dart.dart:5133:10)
#48     AnalysisTask._safelyPerform (package:analyzer/src/task/api/model.dart:341:9)
#49     AnalysisTask.perform (package:analyzer/src/task/api/model.dart:240:7)
#50     AnalysisDriver.performWorkItem (package:analyzer/src/task/driver.dart:285:10)
#51     AnalysisDriver.computeResult (package:analyzer/src/task/driver.dart:110:22)
#52     AnalysisContextImpl.computeResult (package:analyzer/src/context/context.dart:654:14)
#53     AnalysisContextImpl.computeLibraryElement (package:analyzer/src/context/context.dart:622:12)
#54     AnalyzerResolver.libraryFor (package:build_resolvers/src/resolver.dart:114:21)
<asynchronous suspension>
#55     PerActionResolver.libraryFor (package:build_resolvers/src/resolver.dart:65:17)
#56     _DelayedResolver.libraryFor (package:build/src/builder/build_step_impl.dart:192:25)
<asynchronous suspension>
#57     BuildStepImpl.inputLibrary (package:build/src/builder/build_step_impl.dart:37:21)
<asynchronous suspension>
#58     _Builder.build (package:source_gen/src/builder.dart:65:31)
<asynchronous suspension>
#59     runBuilder.buildForInput (package:build/src/generate/run_builder.dart:45:21)
<asynchronous suspension>
#60     MappedListIterable.elementAt (dart:_internal/iterable.dart:414:29)
#61     ListIterator.moveNext (dart:_internal/iterable.dart:343:26)
#62     Future.wait (dart:async/future.dart:392:26)
#63     runBuilder.<anonymous closure> (package:build/src/generate/run_builder.dart:51:36)
#64     _rootRun (dart:async/zone.dart:1124:13)
#65     _CustomZone.run (dart:async/zone.dart:1021:19)
#66     _runZoned (dart:async/zone.dart:1516:10)
#67     runZoned (dart:async/zone.dart:1500:12)
#68     scopeLogAsync (package:build/src/builder/logging.dart:22:3)
#69     runBuilder (package:build/src/generate/run_builder.dart:51:9)
<asynchronous suspension>
#70     _SingleBuild._runForInput.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:455:19)
#71     _NoOpBuilderActionTracker.trackStage (package:build_runner_core/src/generate/performance_tracker.dart:303:15)
#72     _SingleBuild._runForInput.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:453:23)
<asynchronous suspension>
#73     NoOpTimeTracker.track (package:timing/src/timing.dart:222:44)
#74     _SingleBuild._runForInput.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:412:22)
#75     Pool.withResource (package:pool/pool.dart:127:28)
<asynchronous suspension>
#76     _SingleBuild._runForInput (package:build_runner_core/src/generate/build_impl.dart:408:17)
#77     _SingleBuild._runBuilder.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:358:38)
#78     MappedIterator.moveNext (dart:_internal/iterable.dart:392:18)
#79     Future.wait (dart:async/future.dart:392:26)
#80     _SingleBuild._runBuilder (package:build_runner_core/src/generate/build_impl.dart:357:36)
#81     _AsyncAwaitCompleter.start (dart:async/runtime/libasync_patch.dart:49:6)
#82     _SingleBuild._runBuilder (package:build_runner_core/src/generate/build_impl.dart:355:40)
#83     _SingleBuild._runPhases.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:304:20)
#84     _asyncThenWrapperHelper.<anonymous closure> (dart:async/runtime/libasync_patch.dart:77:64)
#85     _rootRunUnary (dart:async/zone.dart:1132:38)
#86     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#87     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#88     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#89     Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#90     Future._complete (dart:async/future_impl.dart:476:7)
#91     _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#92     _AsyncAwaitCompleter.complete (dart:async/runtime/libasync_patch.dart:28:18)
#93     _completeOnAsyncReturn (dart:async/runtime/libasync_patch.dart:295:13)
#94     _SingleBuild._matchingPrimaryInputs (package:build_runner_core/src/generate/build_impl.dart)
#95     _asyncThenWrapperHelper.<anonymous closure> (dart:async/runtime/libasync_patch.dart:77:64)
#96     _rootRunUnary (dart:async/zone.dart:1132:38)
#97     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#98     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#99     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#100    Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#101    Future._completeWithValue (dart:async/future_impl.dart:486:5)
#102    Future.wait.<anonymous closure> (dart:async/future.dart:399:22)
#103    _rootRunUnary (dart:async/zone.dart:1132:38)
#104    _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#105    _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#106    Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#107    Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#108    Future._complete (dart:async/future_impl.dart:476:7)
#109    _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#110    _AsyncAwaitCompleter.complete.<anonymous closure> (dart:async/runtime/libasync_patch.dart:33:20)
#111    _rootRun (dart:async/zone.dart:1120:38)
#112    _CustomZone.run (dart:async/zone.dart:1021:19)
#113    _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#114    _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
#115    _rootRun (dart:async/zone.dart:1124:13)
#116    _CustomZone.run (dart:async/zone.dart:1021:19)
#117    _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#118    _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
#119    _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#120    _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#121    _runPendingImmediateCallback (dart:isolate/runtime/libisolate_patch.dart:115:13)
#122    _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:172:5)


[SEVERE] mobx_codegen|mobx_generator on lib/ui/manage_activities.dart:

AnalysisException: Cannot compute LIBRARY_ELEMENT for Instance of 'AssetBasedSource'
Caused by Unexpected exception while performing ResolveUnitTypeNamesTask for source myapp|lib/stores/activity_list.dart
#0      AnalysisTask._safelyPerform (package:analyzer/src/task/api/model.dart:353:7)
#1      AnalysisTask.perform (package:analyzer/src/task/api/model.dart:240:7)
#2      AnalysisDriver.performWorkItem (package:analyzer/src/task/driver.dart:285:10)
#3      AnalysisDriver.computeResult (package:analyzer/src/task/driver.dart:110:22)
#4      AnalysisContextImpl.computeResult (package:analyzer/src/context/context.dart:654:14)
#5      AnalysisContextImpl.computeLibraryElement (package:analyzer/src/context/context.dart:622:12)
#6      AnalyzerResolver.libraryFor (package:build_resolvers/src/resolver.dart:114:21)
<asynchronous suspension>
#7      PerActionResolver.libraryFor (package:build_resolvers/src/resolver.dart:65:17)
#8      _DelayedResolver.libraryFor (package:build/src/builder/build_step_impl.dart:192:25)
<asynchronous suspension>
#9      BuildStepImpl.inputLibrary (package:build/src/builder/build_step_impl.dart:37:21)
<asynchronous suspension>
#10     _Builder.build (package:source_gen/src/builder.dart:65:31)
<asynchronous suspension>
#11     runBuilder.buildForInput (package:build/src/generate/run_builder.dart:45:21)
<asynchronous suspension>
#12     MappedListIterable.elementAt (dart:_internal/iterable.dart:414:29)
#13     ListIterator.moveNext (dart:_internal/iterable.dart:343:26)
#14     Future.wait (dart:async/future.dart:392:26)
#15     runBuilder.<anonymous closure> (package:build/src/generate/run_builder.dart:51:36)
#16     _rootRun (dart:async/zone.dart:1124:13)
#17     _CustomZone.run (dart:async/zone.dart:1021:19)
#18     _runZoned (dart:async/zone.dart:1516:10)
#19     runZoned (dart:async/zone.dart:1500:12)
#20     scopeLogAsync (package:build/src/builder/logging.dart:22:3)
#21     runBuilder (package:build/src/generate/run_builder.dart:51:9)
<asynchronous suspension>
#22     _SingleBuild._runForInput.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:455:19)
#23     _NoOpBuilderActionTracker.trackStage (package:build_runner_core/src/generate/performance_tracker.dart:303:15)
#24     _SingleBuild._runForInput.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:453:23)
<asynchronous suspension>
#25     NoOpTimeTracker.track (package:timing/src/timing.dart:222:44)
#26     _SingleBuild._runForInput.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:412:22)
#27     Pool.withResource (package:pool/pool.dart:127:28)
<asynchronous suspension>
#28     _SingleBuild._runForInput (package:build_runner_core/src/generate/build_impl.dart:408:17)
#29     _SingleBuild._runBuilder.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:358:38)
#30     MappedIterator.moveNext (dart:_internal/iterable.dart:392:18)
#31     Future.wait (dart:async/future.dart:392:26)
#32     _SingleBuild._runBuilder (package:build_runner_core/src/generate/build_impl.dart:357:36)
#33     _AsyncAwaitCompleter.start (dart:async/runtime/libasync_patch.dart:49:6)
#34     _SingleBuild._runBuilder (package:build_runner_core/src/generate/build_impl.dart:355:40)
#35     _SingleBuild._runPhases.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:304:20)
#36     _asyncThenWrapperHelper.<anonymous closure> (dart:async/runtime/libasync_patch.dart:77:64)
#37     _rootRunUnary (dart:async/zone.dart:1132:38)
#38     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#39     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#40     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#41     Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#42     Future._complete (dart:async/future_impl.dart:476:7)
#43     _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#44     _AsyncAwaitCompleter.complete (dart:async/runtime/libasync_patch.dart:28:18)
#45     _completeOnAsyncReturn (dart:async/runtime/libasync_patch.dart:295:13)
#46     _SingleBuild._matchingPrimaryInputs (package:build_runner_core/src/generate/build_impl.dart)
#47     _asyncThenWrapperHelper.<anonymous closure> (dart:async/runtime/libasync_patch.dart:77:64)
#48     _rootRunUnary (dart:async/zone.dart:1132:38)
#49     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#50     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#51     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#52     Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#53     Future._completeWithValue (dart:async/future_impl.dart:486:5)
#54     Future.wait.<anonymous closure> (dart:async/future.dart:399:22)
#55     _rootRunUnary (dart:async/zone.dart:1132:38)
#56     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#57     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#58     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#59     Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#60     Future._complete (dart:async/future_impl.dart:476:7)
#61     _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#62     _AsyncAwaitCompleter.complete.<anonymous closure> (dart:async/runtime/libasync_patch.dart:33:20)
#63     _rootRun (dart:async/zone.dart:1120:38)
#64     _CustomZone.run (dart:async/zone.dart:1021:19)
#65     _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#66     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
#67     _rootRun (dart:async/zone.dart:1124:13)
#68     _CustomZone.run (dart:async/zone.dart:1021:19)
#69     _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#70     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
#71     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#72     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#73     _runPendingImmediateCallback (dart:isolate/runtime/libisolate_patch.dart:115:13)
#74     _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:172:5)

Caused by NoSuchMethodError: The getter 'typeParameters' was called on null.
Receiver: null
Tried calling: typeParameters
#0      Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
#1      ClassElementImpl._computeMixinAppConstructors (package:analyzer/src/dart/element/element.dart:1100:50)
#2      ClassElementImpl.constructors (package:analyzer/src/dart/element/element.dart:518:30)
#3      ClassElementImpl.unnamedConstructor (package:analyzer/src/dart/element/element.dart:949:40)
#4      InterfaceTypeImpl.lookUpConstructor (package:analyzer/src/dart/element/type.dart:1881:36)
#5      AstRewriteVisitor.visitMethodInvocation (package:analyzer/src/generated/resolver.dart:92:18)
#6      MethodInvocationImpl.accept (package:analyzer/src/dart/ast/ast.dart:8679:49)
#7      VariableDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:12442:19)
#8      UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#9      UnifyingAstVisitor.visitVariableDeclaration (package:analyzer/dart/ast/visitor.dart:3555:59)
#10     ScopedVisitor.visitVariableDeclaration (package:analyzer/src/generated/resolver.dart:6704:11)
#11     VariableDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:12436:49)
#12     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:9174:20)
#13     VariableDeclarationListImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:12538:16)
#14     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#15     UnifyingAstVisitor.visitVariableDeclarationList (package:analyzer/dart/ast/visitor.dart:3559:7)
#16     VariableDeclarationListImpl.accept (package:analyzer/src/dart/ast/ast.dart:12532:15)
#17     VariableDeclarationStatementImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:12593:20)
#18     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#19     UnifyingAstVisitor.visitVariableDeclarationStatement (package:analyzer/dart/ast/visitor.dart:3563:7)
#20     VariableDeclarationStatementImpl.accept (package:analyzer/src/dart/ast/ast.dart:12589:15)
#21     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:9174:20)
#22     BlockImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:1254:17)
#23     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#24     UnifyingAstVisitor.visitBlock (package:analyzer/dart/ast/visitor.dart:3199:31)
#25     ScopedVisitor.visitBlock (package:analyzer/src/generated/resolver.dart:6141:13)
#26     BlockImpl.accept (package:analyzer/src/dart/ast/ast.dart:1250:49)
#27     BlockFunctionBodyImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:1199:13)
#28     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#29     UnifyingAstVisitor.visitBlockFunctionBody (package:analyzer/dart/ast/visitor.dart:3202:55)
#30     ScopedVisitor.visitBlockFunctionBody (package:analyzer/src/generated/resolver.dart:6152:13)
#31     BlockFunctionBodyImpl.accept (package:analyzer/src/dart/ast/ast.dart:1195:49)
#32     MethodDeclarationImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:8541:12)
#33     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#34     UnifyingAstVisitor.visitMethodDeclaration (package:analyzer/dart/ast/visitor.dart:3422:55)
#35     ScopedVisitor.visitMethodDeclarationInScope (package:analyzer/src/generated/resolver.dart:6597:11)
#36     ScopedVisitor.visitMethodDeclaration (package:analyzer/src/generated/resolver.dart:6590:7)
#37     MethodDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:8532:49)
#38     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:9174:20)
#39     ScopedVisitor.visitClassMembersInScope (package:analyzer/src/generated/resolver.dart:6218:18)
#40     ScopedVisitor.visitClassDeclaration (package:analyzer/src/generated/resolver.dart:6196:11)
#41     ClassDeclarationImpl.accept (package:analyzer/src/dart/ast/ast.dart:1765:49)
#42     NodeListImpl.accept (package:analyzer/src/dart/ast/ast.dart:9174:20)
#43     CompilationUnitImpl.visitChildren (package:analyzer/src/dart/ast/ast.dart:2567:21)
#44     UnifyingAstVisitor.visitNode (package:analyzer/dart/ast/visitor.dart:3440:10)
#45     UnifyingAstVisitor.visitCompilationUnit (package:analyzer/dart/ast/visitor.dart:3235:51)
#46     CompilationUnitImpl.accept (package:analyzer/src/dart/ast/ast.dart:2560:49)
#47     ResolveUnitTypeNamesTask.internalPerform (package:analyzer/src/task/dart.dart:5133:10)
#48     AnalysisTask._safelyPerform (package:analyzer/src/task/api/model.dart:341:9)
#49     AnalysisTask.perform (package:analyzer/src/task/api/model.dart:240:7)
#50     AnalysisDriver.performWorkItem (package:analyzer/src/task/driver.dart:285:10)
#51     AnalysisDriver.computeResult (package:analyzer/src/task/driver.dart:110:22)
#52     AnalysisContextImpl.computeResult (package:analyzer/src/context/context.dart:654:14)
#53     AnalysisContextImpl.computeLibraryElement (package:analyzer/src/context/context.dart:622:12)
#54     AnalyzerResolver.libraryFor (package:build_resolvers/src/resolver.dart:114:21)
<asynchronous suspension>
#55     PerActionResolver.libraryFor (package:build_resolvers/src/resolver.dart:65:17)
#56     _DelayedResolver.libraryFor (package:build/src/builder/build_step_impl.dart:192:25)
<asynchronous suspension>
#57     BuildStepImpl.inputLibrary (package:build/src/builder/build_step_impl.dart:37:21)
<asynchronous suspension>
#58     _Builder.build (package:source_gen/src/builder.dart:65:31)
<asynchronous suspension>
#59     runBuilder.buildForInput (package:build/src/generate/run_builder.dart:45:21)
<asynchronous suspension>
#60     MappedListIterable.elementAt (dart:_internal/iterable.dart:414:29)
#61     ListIterator.moveNext (dart:_internal/iterable.dart:343:26)
#62     Future.wait (dart:async/future.dart:392:26)
#63     runBuilder.<anonymous closure> (package:build/src/generate/run_builder.dart:51:36)
#64     _rootRun (dart:async/zone.dart:1124:13)
#65     _CustomZone.run (dart:async/zone.dart:1021:19)
#66     _runZoned (dart:async/zone.dart:1516:10)
#67     runZoned (dart:async/zone.dart:1500:12)
#68     scopeLogAsync (package:build/src/builder/logging.dart:22:3)
#69     runBuilder (package:build/src/generate/run_builder.dart:51:9)
<asynchronous suspension>
#70     _SingleBuild._runForInput.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:455:19)
#71     _NoOpBuilderActionTracker.trackStage (package:build_runner_core/src/generate/performance_tracker.dart:303:15)
#72     _SingleBuild._runForInput.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:453:23)
<asynchronous suspension>
#73     NoOpTimeTracker.track (package:timing/src/timing.dart:222:44)
#74     _SingleBuild._runForInput.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:412:22)
#75     Pool.withResource (package:pool/pool.dart:127:28)
<asynchronous suspension>
#76     _SingleBuild._runForInput (package:build_runner_core/src/generate/build_impl.dart:408:17)
#77     _SingleBuild._runBuilder.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:358:38)
#78     MappedIterator.moveNext (dart:_internal/iterable.dart:392:18)
#79     Future.wait (dart:async/future.dart:392:26)
#80     _SingleBuild._runBuilder (package:build_runner_core/src/generate/build_impl.dart:357:36)
#81     _AsyncAwaitCompleter.start (dart:async/runtime/libasync_patch.dart:49:6)
#82     _SingleBuild._runBuilder (package:build_runner_core/src/generate/build_impl.dart:355:40)
#83     _SingleBuild._runPhases.<anonymous closure>.<anonymous closure> (package:build_runner_core/src/generate/build_impl.dart:304:20)
#84     _asyncThenWrapperHelper.<anonymous closure> (dart:async/runtime/libasync_patch.dart:77:64)
#85     _rootRunUnary (dart:async/zone.dart:1132:38)
#86     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#87     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#88     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#89     Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#90     Future._complete (dart:async/future_impl.dart:476:7)
#91     _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#92     _AsyncAwaitCompleter.complete (dart:async/runtime/libasync_patch.dart:28:18)
#93     _completeOnAsyncReturn (dart:async/runtime/libasync_patch.dart:295:13)
#94     _SingleBuild._matchingPrimaryInputs (package:build_runner_core/src/generate/build_impl.dart)
#95     _asyncThenWrapperHelper.<anonymous closure> (dart:async/runtime/libasync_patch.dart:77:64)
#96     _rootRunUnary (dart:async/zone.dart:1132:38)
#97     _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#98     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#99     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#100    Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#101    Future._completeWithValue (dart:async/future_impl.dart:486:5)
#102    Future.wait.<anonymous closure> (dart:async/future.dart:399:22)
#103    _rootRunUnary (dart:async/zone.dart:1132:38)
#104    _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#105    _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#106    Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#107    Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#108    Future._complete (dart:async/future_impl.dart:476:7)
#109    _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#110    _AsyncAwaitCompleter.complete.<anonymous closure> (dart:async/runtime/libasync_patch.dart:33:20)
#111    _rootRun (dart:async/zone.dart:1120:38)
#112    _CustomZone.run (dart:async/zone.dart:1021:19)
#113    _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#114    _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
#115    _rootRun (dart:async/zone.dart:1124:13)
#116    _CustomZone.run (dart:async/zone.dart:1021:19)
#117    _CustomZone.runGuarded (dart:async/zone.dart:923:7)
#118    _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:963:23)
#119    _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#120    _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#121    _runPendingImmediateCallback (dart:isolate/runtime/libisolate_patch.dart:115:13)
#122    _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:172:5)


[INFO] Running build completed, took 4.0s

[INFO] Caching finalized dependency graph...
[INFO] Caching finalized dependency graph completed, took 35ms

[SEVERE] Failed after 4.1s
pub finished with exit code 1

runInAction return type causes run-time error

Currently runInAction return type is Action, while Action.call return type is dynamic

Action runInAction(Function fn, {String name, ReactiveContext context}) =>
    Action(fn, name: name, context: context)();

The affect:
Dart analyzer pass, but this code fails in run-time:

runInAction(() => x.value = 100);

Possible fixes are:

  1. Make runInAction generic:
T runInAction<T>(T Function() fn, {String name, ReactiveContext context}) =>
    Action(fn, name: name, context: context)();
  1. Change return type to dynamic:
dynamic runInAction(Function fn, {String name, ReactiveContext context}) =>
    Action(fn, name: name, context: context)();

I can submit a PR, to the chosen solution:
Solution 1
Solution 2

Make EnforceActions.observed as the default

Currently EnforceActions.never is the default for mutating observables. It would be safer and better to have it set to observed. This will be stricter but will force everyone to arrive at the right code for mutating observables.

No stray mutations by default.

Mobx codegen ignores stores with generic parametes

Example:

import 'package:mobx/mobx.dart';

part 'test_store.g.dart';

class TestStore<T> = TestStoreBase<T> with _$TestStore<T>;

abstract class TestStoreBase<T> implements Store {
  //
}

is skipped, nothing is generated, no error in generator output

Package organization

Currently the repository deviates somewhat from the Pub package layout conventions (https://www.dartlang.org/tools/pub/package-layout#implementation-files).

The lib/src/api files should be in lib/, as those seem to be public files, lib/src/core should maybe be in lib/src/ because they seem to be mostly private details.

Also, Dart's visibility rules are a bit different from other languages I've used before, since "private" means "private to the module". This means that a lot of code has to be in the same file if the classes need to use private methods from other classes. As an example, Flutters base widgets are in a single file.

Flutter hooks integration

A discussion specific to flutter_hooks integration, as I think there's a lot to talk about.

The current candidates:

  • useObserver
  • useWhen
  • useReaction
  • useAction
  • useAutorun

useObserver

I see two potential usages:

useObserver();
someStore.field; // subscribed to field

And

final result = useObserver.scoped(() {
  someStore.field; // listen to field
  return 42;
});
someStore.otherField; // outside of the scope, not listened

useObserver is used when we want to rebuild a widget based on a mobx store.

The scoped version can be useful for custom hooks published to pub. We may not want to observe the entire build method in that case.


Specs of others coming soon~


I think what should really be discussed of is how do we want to handle rebuild and hot reload.

One thing that flutter_hooks allows is dynamically changing the callback passed to a useAction and similar.

Depending on how we implement it, the behavior may be unexpected.

Add spying and tracing capability

Possibly have some integration with Observatory. Not sure if we can build plugins for Observatory which are MobX specific but worth exploring.

Usage example with Firebase FireStore

The most common usecase for most of the developers will be using state management with a cloud database source.. like Firebase FireStore.

Any example of implementing such CRUD actions will be great. I am willing to use MobX for the same usecase.

Write an awesome README.md

Title says all 😀, yet a few things that should be included for sure:

  • Logo
  • Slogan, Gist of MobX
  • Short description and then a longer essay (perhaps)
  • Badges
  • TOC
  • Contributors list
  • Examples that are simple, medium and complex with clear descriptions
  • Links to website and sample projects
  • Community
  • Crisp language

Take inspiration from Awesome Readme

What's remaining for a 0.1 release?

I think feature wise, it's looking solid. Curious if there is anything sorely pending for a 0.1 release. At this point I see only the following:

  • Finalize features for 0.1 and harden them with more tests
  • Update Readme
  • Update the website with API docs and guidance for building larger apps
  • Add few more examples
  • Anything else...

What say @katis, @rrousselGit ?

Make example readme beginner friendly

I'm a beginner in flutter, coming from react-native mobx and need more instructions on how to get the examples and generators running. Now that the android and ios folders have been removed I'm not able to use flutter run any more and I would like it for other beginners not struggle as much as I'm currently doing...

First I got this error as soon as I added the current mobx to a new project from flutter create.

Because every version of flutter_test from sdk depends on meta 1.1.6 and mobx >=0.0.24 depends on meta ^1.1.7, flutter_test from sdk is incompatible with mobx >=0.0.24.

... so I had to figured out how to use dependency_overrides, which is hopefully the right way to resolve this.

dependency_overrides:
    meta: ^1.1.7`

Now I'm stuck with the generators. I've pasted the store from the example to my newly created project with build_runner and mobx_codegen as dev dependencies and according to the readme I should be able to call flutter packages pub run build_runner build but nothing is being generated. After some googling I figured out that I need a build.yaml and I found one in the mobx_codegen I'm trying to steal from it, but I can't figure out how to make it work 😢

All in all, it would be really helpful to have the readme in the example written in such a way, that a beginner like me can get started and dabble around a bit much faster 👍Please add a requirement section to the example readme with links to the flutter install page and a getting started section with a list of all commands necessary to make a fresh clone from this repository run on a simulator including every command required to re-generate/rebuild stuff after code edits.

Thank you so much for your huge efforts. I've been having a blast following the progress of this repo and I'm very much excited to get my hands dirty with flutter+mobx.

meta version conflict with Flutter master and dev branch

Error:

Because every version of flutter_test from sdk depends on meta 1.1.6 and mobx >=0.0.24 depends on meta ^1.1.7, flutter_test from sdk is incompatible with mobx >=0.0.24.

@pavanpodila Should we downgrade meta dependency to version 1.1.6 in mobx or do we need to raise an issue in flutter repo for upgrading meta version.
Version:

mobx: 0.0.33
flutter_mobx: 0.0.8
mobx_codegen: 0.0.4

Tested it on flutter master and dev branch, same issue.

Observer throw exception using Computed value

I initialize a Computed value right before initialize my widget, Computed.value will throw an exception in Observer.
however Observable that just created would NOT.
If I initialize the Computed value long time before I initialize my widget, Computed.value will NOT throw an exception.

btw, I am using master branch, and I am using it in a real project.

here is the stacktrace:

flutter: # 0      Computed.value (file:///Users/shallow/Codes/dfe/db-app-flutter/packages/mobx/lib/src/core/computed.dart:81:7)
flutter: # 1      _ProfileCenterState._buildTop.<anonymous closure> (package:doubi/foundation/view/profile_center/profile_center.dart:149:66)
flutter: # 2      ObserverState.build (package:flutter_mobx/flutter_mobx.dart:46:21)
flutter: # 3      StatefulElement.build (package:flutter/src/widgets/framework.dart:3809:27)
flutter: # 4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3721:15)
flutter: # 5      Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5)
flutter: # 6      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3701:5)
flutter: # 7      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3848:11)
flutter: # 8      ComponentElement.mount (package:flutter/src/widgets/framework.dart:3696:5)
flutter: # 9      Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 10     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4965:32)
flutter: # 11     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 12     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4965:32)
flutter: # 13     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 14     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4965:32)
flutter: # 15     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 16     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
flutter: # 17     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3732:16)
flutter: # 18     Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5)
flutter: # 19     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3701:5)
flutter: # 20     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3696:5)
flutter: # 21     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 22     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
flutter: # 23     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3732:16)
flutter: # 24     Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5)
flutter: # 25     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3701:5)
flutter: # 26     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3696:5)
flutter: # 27     ParentDataElement.mount (package:flutter/src/widgets/framework.dart:4047:11)
flutter: # 28     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 29     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4965:32)
flutter: # 30     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 31     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
flutter: # 32     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4860:14)
flutter: # 33     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 34     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
flutter: # 35     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3732:16)
flutter: # 36     Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5)
flutter: # 37     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3701:5)
flutter: # 38     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3696:5)
flutter: # 39     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 40     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
flutter: # 41     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4860:14)
flutter: # 42     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 43     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
flutter: # 44     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4860:14)
flutter: # 45     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 46     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
flutter: # 47     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3732:16)
flutter: # 48     Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5)
flutter: # 49     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3701:5)
flutter: # 50     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3696:5)
flutter: # 51     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 52     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
flutter: # 53     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3732:16)
flutter: # 54     Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5)
flutter: # 55     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3701:5)
flutter: # 56     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3696:5)
flutter: # 57     ParentDataElement.mount (package:flutter/src/widgets/framework.dart:4047:11)
flutter: # 58     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 59     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
flutter: # 60     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3732:16)
flutter: # 61     Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5)
flutter: # 62     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3701:5)
flutter: # 63     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3848:11)
flutter: # 64     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3696:5)
flutter: # 65     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
flutter: # 66     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
flutter: # 67     SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1028:36)
flutter: # 68     SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1013:20)
flutter: # 69     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2266:19)
flutter: # 70     SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1006:11)
flutter: # 71     RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:274:23)
flutter: # 72     RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1730:58)
flutter: # 73     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:799:15)
flutter: # 74     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1730:13)
flutter: # 75     RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:263:5)
flutter: # 76     RenderSliverMultiBoxAdaptor.addInitialChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:341:5)
flutter: # 77     RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:78:12)
flutter: # 78     RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 79     RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:182:11)
flutter: # 80     RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 81     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:405:13)
flutter: # 82     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1316:12)
flutter: # 83     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1234:20)
flutter: # 84     RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 85     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 86     RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 87     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 88     RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 89     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 90     RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 91     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 92     RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 93     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 94     RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 95     MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:142:11)
flutter: # 96     _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:339:7)
flutter: # 97     MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:212:7)
flutter: # 98     RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:356:14)
flutter: # 99     RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 100    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 101    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 102    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 103    _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1188:11)
flutter: # 104    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 105    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 106    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 107    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 108    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 109    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 110    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 111    RenderStack.performLayout (package:flutter/src/rendering/stack.dart:510:15)
flutter: # 112    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 113    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 114    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 115    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 116    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 117    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 118    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 119    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 120    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 121    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 122    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 123    RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:2879:14)
flutter: # 124    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 125    RenderStack.performLayout (package:flutter/src/rendering/stack.dart:510:15)
flutter: # 126    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 127    __RenderTheatre&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: post http://api.idoubi.top:18010/api-business/user/profile {code: 0, message: success, data: {id: 4, nickname: 哦~, avatarUrl: /images/usericon/4.png, wechatNumber: yay, credit: 100, signature: 这个人很懒,什么都没写。, country: **, province: 上海市, city: 上海市, gender: 2, remainder: 74013265, prize: 100, fanNumber: 1, friendNumber: 7, followNumber: 1, jgname: ocZI-2yXKmj3mPq2FC5FyNpMOL51}, time: 2019-01-17 12:14:59}
flutter: # 128    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 129    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 130    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 131    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 132    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 133    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 134    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 135    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 136    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 137    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:104:13)
flutter: # 138    RenderObject.layout (package:flutter/src/rendering/object.dart:1634:7)
flutter: # 139    RenderStack.performLayout (package:flutter/src/rendering/stack.dart:510:15)
flutter: # 140    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1509:7)
flutter: # 141    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:768:18)
flutter: # 142    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:281:19)
flutter: # 143    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:677:13)
flutter: # 144    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:219:5)
flutter: # 145    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990:15)
flutter: # 146    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:930:9)
flutter: # 147    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:842:5)
flutter: # 148    _invoke (dart:ui/hooks.dart:154:13)
flutter: # 149    _drawFrame (dart:ui/hooks.dart:143:3)

Edit by @katis : quoted the stacktrace as it was accidentally referencing every issue we have

Push for 100% Code coverage

Few areas are a little tricky to test:

  • Reaction with delays
  • Can the suspend() method be removed from Reaction or done differently
  • Check for cycles in computed

@katis, curious if you have ideas to tackle this

Code generator design

Since we've started working on the code generation, I thought I'd open a discussion thread about its design.

We need at least three working annotations, @observable, @computed and @action.

The generator will find all classes with a specific annotation (@observable, @store?) and creates a private subclass _$ParentClass that overrides the annotated fields, getters and methods with Mobx magic.

I'll use parts of this annotated class in the next sections:

@store // tbd
class User {
  @observable
  String firstName = 'Jane';

  @observable
  String lastName = 'Doe';

  @computed
  String get fullName => '$firstName $lastName';

  @action
  void updateNames({String firstName, String lastName }) {
    ...
  }
}

@observable

The first approach I tried was with a hidden Observable<T> field:

class _$User {
  final _$firstName = Observable<String>(null, name: 'User.firstName');

  @override
  String get firstName => _$firstName.value;

  @override
  set firstName(String value) => _$firstName.value = value;
}

This had some downsides. One was that the User creates storage for the original firstName field which then ends up unused. Second is that the initialization becomes slightly more complicated. The initial value must be copied from the superclasses field, and the field must be nulled so that it doesn't keep the initial value in memory. Code would look something like this:

class _$User {
 _$User() {
   _$firstName.value = super.firstName;
   super.firstName = null;
 }

 final _$firstName = Observable<String>(null, name: 'User.firstName');

  @override
  String get firstName => _$firstName.value;

  @override
  set firstName(String value) => _$firstName.value = value;
}

My second attempt was with an Atom which made the initialization a non-issue, since it just uses the original field:

class _$User {
 final _$firstNameAtom = Atom(name: 'User.firstName');

  @override
  String get firstName {
     _$firstNameAtom.reportObserved();
    return super.firstName;
  }

  @override
  set firstName(String value) {
    super.firstName = value;
    _$firstNameAtom.reportChanged();
  }
}

I think the Atom method is better, for the reasons above.

@computed

Computed should be simple, just override a getter and use the original one:

class _$User {
  _$User() {
    _$fullNameComputed = Computed(() => super.fullName);
  }

 Computed<String> _$fullNameComputed;

  @override
  String get fullName => _$fullNameComputed.value;
}

@action

The @action annotation has a name conflict with the current action() builder. We could remove action() and replace it with multiple action variants for different function arities: action0<R>(() => ...), action1<A, R>((a: A) => ...), action2<A, B, R>((a: A, b: B) => ...). The names are ugly, but they could be used by the codegen and I think that once the code generator is done, people won't use the raw versions much.

class _$User {
  _$User() {
    _$updateNames = action2((String a, String b) => super.updateNames(firstName: a, lastName: b));
  }

  Action2<String, String ,void> _$updateNames;

  @override
  void updateNames({String firstName, String lastName}) {
    _$updateNames(firstName, lastName);
  }
}

Named vs. positional arguments will add complexity in the generator.

Automatic conversions

Mobx JS makes objects and arrays automatically observable when you use the @observable decorator.
You can opt-out by using @observable.ref decorator instead.

Dart can't support the feature for classes, but it would be possible (sort of) for collections like Maps and Lists.

I'm not a fan of it as a default, and using an ObservableList is not much harder than using a List.

class ShoppingCart {
  @observable
  List<Item> items = [];
}

vs.

class ShoppingCart {
  @observable
  List<Item> items = ObservableList();
}

Since we can't modify the actual list assigned to the variable like in JS but only wrap it, it might be confusing that the non-observable List you passed to ShoppingCart.items is suddenly a reactive list when accessed from items.

final items = [];

final cart = ShoppingCart();
cart.items = items; // Supposedly items and cart.items are the same list

cart.items.add(Item()); // Mobx reacts to the change :)

items.add(Item()); // Mobx misses the change :(

Constructors

The generator should be able to create a constructor that matches the superclass factory that delegates to the subclass:

class User {
  // 
  User._(this.firstName, this.lastName);

  // Dart can delegate to the subclass constructor with this syntax
  factory User({String firstName, String lastName}) => _$User; // This could also determine the name of the subclass?
}

class _$User {
  _$User({String firstName, String lastName})
    : super._(firstName, lastName}) {
  }
}

observe() support in annotated classes

We would want the generated classes to be supported in devtools etc, but the problem is that the Atoms, Computeds etc are hidden in the subclass. It would be ugly to expose them as public, and you'd have to cast the User to _$User.

Another way would be to define an interface like:

abstract class Store {
  void observe(String field, listener);
}

make the annotated class abstract, and implement Store:

abstract class User implements Store {
}

Then the code generation could implement Store automatically:

class _$User extends User {
  void observe(String field, listener) {
    if (field == 'firstName') { ... }
    // etc.
  }
}

Store interface could also expose a Map of observable fields, so devtools could iterate and analyze them.

[TodoExample] Tapping Todo list items causes MobXException

Hi,

tapping Todo list items in TodoExample currently causes MobXException "Side effects like changing state are not allowed at this point."
I rebuilt generated file todos.g.dart with flutter packages pub run build_runner build but the problem remains.

I/flutter (10412): ══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════
I/flutter (10412): The following MobXException was thrown while handling a gesture:
I/flutter (10412): Instance of 'MobXException'
I/flutter (10412):
I/flutter (10412): When the exception was thrown, this was the stack:
I/flutter (10412): #0      ReactiveContext.checkIfStateModificationsAreAllowed (file:///C:/project/flutter/mobx.dart/mobx/lib/src/core/context.dart:145:11)
I/flutter (10412): #1      Todo.done= (file:///c:/project/flutter/mobx.dart/flutter_mobx/example/lib/todos/todos.g.dart:35:17)
I/flutter (10412): #2      TodoListView.build.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (file:///c:/project/flutter/mobx.dart/flutter_mobx/example/lib/todos/todo_widgets.dart:57:56)
I/flutter (10412): #3      CheckboxListTile.build.<anonymous closure> (package:flutter/src/material/checkbox_list_tile.dart:206:43)
I/flutter (10412): #4      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:513:14)
I/flutter (10412): #5      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:568:30)
I/flutter (10412): #6      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:120:24)
I/flutter (10412): #7      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:242:9)
I/flutter (10412): #8      TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:204:7)
I/flutter (10412): #9      GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
I/flutter (10412): #10     _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:184:20)
I/flutter (10412): #11     _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:158:22)
I/flutter (10412): #12     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:138:7)
I/flutter (10412): #13     _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:101:7)
I/flutter (10412): #14     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:85:7)
I/flutter (10412): #18     _invoke1 (dart:ui/hooks.dart:203:10)
I/flutter (10412): #19     _dispatchPointerDataPacket (dart:ui/hooks.dart:138:5)
I/flutter (10412): (elided 3 frames from package dart:async)
I/flutter (10412):
I/flutter (10412): Handler: onTap
I/flutter (10412): Recognizer:
I/flutter (10412):   TapGestureRecognizer#43687(debugOwner: GestureDetector, state: ready, won arena, finalPosition:
I/flutter (10412):   Offset(129.1, 411.0), sent tap down)
I/flutter (10412): ════════════════════════════════════════════════════════════════════════════════════════════════════

Move to monorepo

This will house various packages and make it easy to maintain:

Core

  • mobx.dart (primary project)
  • flutter_mobx (flutter bindings)
  • mobx_generator (will contain code generator. Name is not final)
  • flutter_mobx_hooks (hooks driven state management)
  • website (public facing website, possibly hosted on github.io.)

Experimental

  • mobx_observatory (experimental tool for visualizing the internals of MobX as it runs an app. This will be possible if we run a tiny web-server with web-socket that posts messages when various events occur inside MobX. It will also expose a localhost url that can be opened in Chrome to see the visualization. The visualization itself can be built with React 🤓. Think of this as the Observatory for MobX )

Libraries should be plain Dart/Flutter packages instead of a plugin

By looking at the folders inside mobx_codegen, flutter_mobx, and mobx, you can see android and ios folders there. As far as I can tell, none of these packages need to be plugins.

To me, it seems that the projects have been originally created using the Flutter plugin template project, but the pubspec files have been since cleaned out from Flutter plugin stuff. If this is the case, it should be fine to just remove the android and ios folders and call it a day. It shouldn't matter anyway, but it might be confusing to look at the source for some.

Extract a Listener mixin from Listenable and Interceptable

Currently the Listenable and Interceptable classes have almost the same implementation barring a few differences:

  • Notification type
  • notification logic function

I think these can be extracted out into a common Listener mixin that can be used by Listenable and Interceptable. Technically the behavior of add, remove, notify of a listener is exactly the same and there is no need to duplicate this logic between the two classes.

Error using async inside actions

I think is not possible to use async using @action.

When I use it Im getting the following error:
This works nice:

  @observable
  List<Location>locations = [];

  @action
  Future<List<Location>> fetchLocations(){
    _apiClient.getLocations().then((x){
      locations.addAll(x);
    });
  }

But this:

  @action
  Future<List<Location>> fetchLocations() async {
    locations = await _apiClient.getLocations();
  }

Generates an error:

[SEVERE] mobx_codegen|mobx_generator on lib/ui/location/state/locations.dart:
Could not make class "Locations" observable. Changes needed:
  1. Remove async modifier from the method "fetchLocations"


How to properly share state between widgets without using props?

There are use-cases where we need to connect two different components that are not accessible directly. I looked into the examples but it only shows sharing MobX state via props.

As I have seen, we can use a global variable to share state between widgets but it is weird sharing state like that. Is there an ergonomic way and if there is, an example would be awesome. 👍

Flutter API

Last night I thought I'd try to use Mobx with Flutter and created a simple widget based on the design of mobx-react and Flutter's ValueListenableBuilder:

import 'package:flutter/widgets.dart';
import 'package:mobx/mobx.dart';

void noOp() {}

class Observer extends StatefulWidget {
  const Observer({Key key, @required this.builder}) : super(key: key);

  final Widget Function(BuildContext) builder;

  @override
  State<StatefulWidget> createState() => _ObserverState();
}

class _ObserverState extends State<Observer> {
  bool _isBuildPending = false;

  Reaction _buildReaction;

  @override
  void initState() {
    super.initState();

    _buildReaction = Reaction(mobxContext, () {
      if (_isBuildPending) {
        return;
      }

      _isBuildPending = true;
      if (!mounted) {
        return;
      }

      setState(noOp);
    });
  }

  @override
  Widget build(BuildContext context) {
    _isBuildPending = false;
    Widget result;
    _buildReaction.track(() {
      result = widget.builder(context);
    });
    return result;
  }
}

usage:

class Greeter extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _GreeterState();
}

class _GreeterState extends State<Greeter> {
  final name = observable('Jane');

  @override
  Widget build(BuildContext context) => Observer(builder: (context) {
    return Text('Hello, ${name.value}');
  });
}

It does seem to work and could be a starting point for the flutter_mobx API. Probably the life cycle of widgets will bring all kinds of problems like in mobx-react.

Factories vs Builder functions

Should we use Dart factories instead of builder functions for the public API?

If we renamed ObservableValue to Observable and ComputedValue to Computed, made the constructor private and added a public factory like this:

class Observable<T> {
  Observable._(ReactiveContext context, String name, T initialValue) { ... }

  factory Observable(T initialValue, { String name, ReactiveContext context }) { .... }
}

Then the use would still be simple like with the builder function:

class MyStore {
  final value = Observable(10);
}

This is just a personal preference of mine though as I feel the factory would be more Darty.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.