1

I am new to Flutter and this is my first time using ChangeNotifierProxyProvider following YouTube tutorial. I did the exact way it was done but I got this error in vs code. Is there anything I missed or I am doing it wrong. Please help me solve this problem. Thank you.

Error Null check operator used on a null value

main.dart

 MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (_) => AuthProvider(),
        ),
        //send the value of user form authProvider to booking provider
        //error here.
        ChangeNotifierProxyProvider<AuthProvider, BookingProvider>(
          create: (_) => BookingProvider(),
          update: (_, authProvider, bookingProvider) => bookingProvider!
            ..loadUser(authProvider.getUser!), 
        )
      ],

booking_provider.dart

class BookingProvider extends ChangeNotifier {
  User? _user;

  void loadUser(User user) {
    _user = user;
    notifyListeners();
  }
}

auth_provider.dart

class AuthProvider extends ChangeNotifier {
  User? _user;
  String _docUser = '';
  User? get getUser {
    return _user; // user has value
  }
}
════════ Exception caught by widgets library ═══════════════════════════════════
The following _CastError was thrown building _InheritedProviderScope<BookingProvider?>(dirty, dependencies: [_InheritedProviderScope<AuthProvider?>], value: Instance of 'BookingProvider', listening to value):
Null check operator used on a null value

The relevant error-causing widget was
ChangeNotifierProxyProvider<AuthProvider, BookingProvider>
package:queuems/main.dart:64
When the exception was thrown, this was the stack
#0      MyApp.build.<anonymous closure>
package:queuems/main.dart:67
#1      new ListenableProxyProvider.<anonymous closure>
package:provider/src/listenable_provider.dart:123
#2      _CreateInheritedProviderState.build
package:provider/src/inherited_provider.dart:839
#3      _InheritedProviderScopeElement.build
package:provider/src/inherited_provider.dart:539
#4      ComponentElement.performRebuild
package:flutter/…/widgets/framework.dart:4588
#5      _InheritedProviderScopeElement.performRebuild
package:provider/src/inherited_provider.dart:495
#6      Element.rebuild
package:flutter/…/widgets/framework.dart:4311
#7      BuildOwner.buildScope
package:flutter/…/widgets/framework.dart:2578
#8      WidgetsBinding.drawFrame
package:flutter/…/widgets/binding.dart:882
#9      RendererBinding._handlePersistentFrameCallback
package:flutter/…/rendering/binding.dart:363
#10     SchedulerBinding._invokeFrameCallback
package:flutter/…/scheduler/binding.dart:1145
#11     SchedulerBinding.handleDrawFrame
package:flutter/…/scheduler/binding.dart:1082
#12     SchedulerBinding._handleDrawFrame
package:flutter/…/scheduler/binding.dart:996
#16     _invoke (dart:ui/hooks.dart:150:10)
#17     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:270:5)
#18     _drawFrame (dart:ui/hooks.dart:114:31)

(elided 3 frames from dart:async)
════════════════════════════════════════════════════════════════════════════════
I/flutter (21019): {status: true, message: Successful login, user: Instance of 'User'}
E/flutter (21019): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe.
E/flutter (21019): At this point the state of the widget's element tree is no longer stable.
E/flutter (21019): To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.
E/flutter (21019): #0      Element._debugCheckStateIsActiveForAncestorLookup.<anonymous closure>
package:flutter/…/widgets/framework.dart:3990
E/flutter (21019): #1      Element._debugCheckStateIsActiveForAncestorLookup
package:flutter/…/widgets/framework.dart:4004
E/flutter (21019): #2      Element.findRootAncestorStateOfType
package:flutter/…/widgets/framework.dart:4064
E/flutter (21019): #3      Navigator.of
package:flutter/…/widgets/navigator.dart:2546
E/flutter (21019): #4      LoginBody.build.<anonymous closure>.<anonymous closure>
package:queuems/…/login/login_body.dart:163
E/flutter (21019): #5      _rootRunUnary (dart:async/zone.dart:1436:47)
E/flutter (21019): #6      _CustomZone.runUnary (dart:async/zone.dart:1335:19)
E/flutter (21019): <asynchronous suspension>
E/flutter (21019):

atigdawgahb
  • 41
  • 1
  • 5

2 Answers2

0

You are trying get a user (authProvider.getUser!) when user variable doesn't initialized. By default, _user variable is null, and when you get it by getUser in loadUser it is still null. You can initialize this value in other place (load from database or other source).

fartem
  • 2,361
  • 2
  • 8
  • 20
0
 ChangeNotifierProxyProvider<AuthProvider?, BookingProvider?>(
          create: (_) => BookingProvider(),
          update: (_, authProvider, bookingProvider) => bookingProvider!
            ..loadUser(authProvider.getUser!), 
        )

Use this