mobxjs / mobx.dart Goto Github PK
View Code? Open in Web Editor NEWMobX for the Dart language. Hassle-free, reactive state-management for your Dart and Flutter apps.
Home Page: https://mobx.netlify.app
License: MIT License
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
This has been requested already but want to make this an explicit task.
These examples will also show up on the pub site, which is a great introduction to MobX.
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 theall.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
Flutter has a nice page listing the available state management solutions: https://flutter.io/docs/development/data-and-backend/state-mgmt/options
This is something we can contribute to through https://github.com/flutter/website
borrowing ideas from mobxjs. Should also include the observe
/intercept
hooks.
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.
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
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:
runInAction
generic:T runInAction<T>(T Function() fn, {String name, ReactiveContext context}) =>
Action(fn, name: name, context: context)();
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
Current builds are taking too long (20-30 mins). Would be great to speed it up!
Here is the history of build times: https://travis-ci.com/mobxjs/mobx.dart/builds
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.
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
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.
Title says all :-). Go here for some inspiration.
A discussion specific to flutter_hooks
integration, as I think there's a lot to talk about.
The current candidates:
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.
Possibly have some integration with Observatory. Not sure if we can build plugins for Observatory which are MobX specific but worth exploring.
Brian has a nice collection of example code for various state-management frameworks, all building TODOMVC. Let's submit one for MobX as well 🥇.
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.
Title says all 😀, yet a few things that should be included for sure:
Take inspiration from Awesome Readme
I would be great if mobx_codegen emmited some form of serialization/deserialization functions for Observable objects. toJson/fromJson
or something like this.
Hi Team !
I manage Awesome Flutter https://github.com/Solido/awesome-flutter 11000 stars.
I'd be really happy to have a slot for MobX in the state management section.
Please send a Request and you'll be added !
I think that the project would benefit from adding more analysis rules, and now at the beginning of the project is probably a good place to do it.
https://www.dartlang.org/guides/language/analysis-options#the-analysis-options-file
I'd be willing to work on this, adding rules and fixing their suggestions.
I think I could start by adding the prefer_final_locals
rule, and replacing var
s with final
s.
It should throw an error to help the developer ensure such cycles are eliminated. MobX JS keeps a convergence count and bails out after 100 iterations in a reaction.
This check can be seen here.
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:
What say @katis, @rrousselGit ?
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.
It's a good check to ensure no surprises. I just spent few mins to discover I had not marked the field as @observable
. This check will ensure we get warned upfront.
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.
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
This is the marketing site + docs. I am thinking a site in Gatsby would be good and easy to maintain over time.
Few areas are a little tricky to test:
suspend()
method be removed from Reaction or done differentlycomputed
@katis, curious if you have ideas to tackle this
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.
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 :(
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 classesWe 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.
@katis, can you help me figure this out?
The increase-coverage branch is failing on this test only on the travis server but works locally. Here is the Travis link
i copy paste todo example to a new proj i got above error > there are no observables detected in your builder
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): ════════════════════════════════════════════════════════════════════════════════════════════════════
Hey @pavanpodila, looks like you've been making great progress! Do we have an example of ObservableValue yet?
This will house various packages and make it easy to maintain:
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 )Support the enforceActions
feature of MobX JS
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.
This will be mostly inspired from MobX.
Currently the Listenable and Interceptable classes have almost the same implementation barring a few differences:
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.
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"
This can be used in tools to slow down reactions for visualizations.
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. 👍
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
.
Now, I am writing annotation generator for mobx.dart.
Here is the repo, https://github.com/copydog/mobx_annotation
If you are interested, let me know how I can contribute to the mobx.dart.
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.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.