rrousselGit / state_notifier

ValueNotifier, but outside Flutter and with some extra perks
MIT License
311 stars 28 forks source link

Isn't it possible to call LocatorMixin's `read<T>()` at StateNotifier's constructor? #6

Closed mono0926 closed 4 years ago

mono0926 commented 4 years ago

Isn't it possible to call LocatorMixin's read<T>() at StateNotifier's constructor?

I've tried it, https://github.com/mono0926/state_notifier/blob/2ca837048254c4e0e18abd3035b423a61d4fc62d/example/lib/my_state_notifier.dart#L19-L22

But it threw error.

Should I give up this kind of usage? If so, I'm considering to pass Locator by constructor argument 🤔

Error log flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ flutter: The following DependencyNotFoundException was thrown building MyHomePage(dirty): flutter: Instance of 'DependencyNotFoundException' flutter: flutter: The relevant error-causing widget was: flutter: MyHomePage file:///Users/mono/Git/state_notifier/example/lib/main.dart:34:13 flutter: flutter: When the exception was thrown, this was the stack: flutter: #0 new _MyStateNotifier&StateNotifier&LocatorMixin. (package:state_notifier/state_notifier.dart:254:31) flutter: #1 new MyStateNotifier (package:example/my_state_notifier.dart:21:5) flutter: #2 main. (package:example/main.dart:21:26) flutter: #3 StateNotifierProvider.buildWithChild. (package:flutter_state_notifier/flutter_state_notifier.dart:172:24) flutter: #4 _CreateInheritedProviderState.value (package:provider/src/inherited_provider.dart:532:27) flutter: #5 _InheritedProviderScopeElement.value (package:provider/src/inherited_provider.dart:420:33) flutter: #6 Provider.of (package:provider/src/provider.dart:212:29) flutter: #7 ReadContext.read (package:provider/src/provider.dart:421:27) flutter: #8 StateNotifierProvider.buildWithChild. (package:flutter_state_notifier/flutter_state_notifier.dart:215:38) flutter: #9 _CreateDeferredInheritedProviderElement.controller (package:provider/src/deferred_inherited_provider.dart:182:30) flutter: #10 _DeferredDelegateState.value (package:provider/src/deferred_inherited_provider.dart:103:7) flutter: #11 _InheritedProviderScopeElement.value (package:provider/src/inherited_provider.dart:420:33) flutter: #12 SelectContext.select (package:provider/src/inherited_provider.dart:194:36) flutter: #13 MyHomePage.build (package:example/main.dart:56:23) flutter: #14 StatelessElement.build (package:flutter/src/widgets/framework.dart:4576:28) flutter: #15 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4502:15) flutter: #16 Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5) flutter: #17 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4481:5) flutter: #18 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4476:5) flutter: ... Normal element mounting (24 frames) flutter: #42 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14) flutter: #43 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5947:32) flutter: ... Normal element mounting (119 frames) flutter: #162 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14) flutter: #163 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5947:32) flutter: ... Normal element mounting (253 frames) flutter: #416 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14) flutter: #417 Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18) flutter: #418 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16) flutter: #419 _InheritedProviderScopeElement.performRebuild (package:provider/src/inherited_provider.dart:344:11) flutter: #420 Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5) flutter: #421 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4481:5) flutter: #422 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4476:5) flutter: ... Normal element mounting (7 frames) flutter: #429 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:223:11) flutter: #430 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14) flutter: #431 Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18) flutter: #432 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16) flutter: #433 _InheritedProviderScopeElement.performRebuild (package:provider/src/inherited_provider.dart:344:11) flutter: #434 Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5) flutter: #435 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4481:5) flutter: #436 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4476:5) flutter: ... Normal element mounting (7 frames) flutter: #443 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:223:11) flutter: ... Normal element mounting (7 frames) flutter: #450 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:223:11) flutter: ... Normal element mounting (7 frames) flutter: #457 _NestedHookElement.mount (package:nested/nested.dart:188:11) flutter: #458 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14) flutter: #459 Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18) flutter: #460 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16) flutter: #461 _InheritedProviderScopeElement.performRebuild (package:provider/src/inherited_provider.dart:344:11) flutter: #462 Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5) flutter: #463 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4481:5) flutter: #464 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4476:5) flutter: ... Normal element mounting (7 frames) flutter: #471 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:223:11) flutter: ... Normal element mounting (7 frames) flutter: #478 _NestedHookElement.mount (package:nested/nested.dart:188:11) flutter: ... Normal element mounting (7 frames) flutter: #485 SingleChildWidgetElementMixin.mount (package:nested/nested.dart:223:11) flutter: #486 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3446:14) flutter: #487 Element.updateChild (package:flutter/src/widgets/framework.dart:3214:18) flutter: #488 RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1142:16) flutter: #489 RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:1113:5) flutter: #490 RenderObjectToWidgetAdapter.attachToRenderTree. (package:flutter/src/widgets/binding.dart:1055:17) flutter: #491 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2607:19) flutter: #492 RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:1054:13) flutter: #493 WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:935:7) flutter: #494 WidgetsBinding.scheduleAttachRootWidget. (package:flutter/src/widgets/binding.dart:917:7) flutter: (elided 11 frames from class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch) flutter: flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════ ════════ Exception caught by widgets library ═══════════════════════════════════════════════════════ The following NoSuchMethodError was thrown building MyHomePage(dirty): The method 'addListener' was called on null. Receiver: null Tried calling: addListener(Closure: (Object) => void from Function 'setState':.) When the exception was thrown, this was the stack: #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5) #1 StateNotifierProvider.buildWithChild. (package:flutter_state_notifier/flutter_state_notifier.dart:217:29) #2 _DeferredDelegateState.value (package:provider/src/deferred_inherited_provider.dart:100:34) #3 _InheritedProviderScopeElement.value (package:provider/src/inherited_provider.dart:420:33) #4 SelectContext.select (package:provider/src/inherited_provider.dart:194:36) ... ════════════════════════════════════════════════════════════════════════════════════════════════════
mono0926 commented 4 years ago

If so, I'm considering to pass Locator by constructor argument 🤔

Or, it works well by wrapping with Future.microtask(): https://github.com/mono0926/state_notifier/commit/31b0aa11585a359c2dd36f3458114d74df687491

rrousselGit commented 4 years ago

Constructors indeed won't work. You could use update, which should work.

We could have an initState-like function too.

mono0926 commented 4 years ago

@rrousselGit

Thanks for the response! Please, feel free to close this or keep for future related enhancements.

We could have an initState-like function too.

I’d like this 🙏