Flutter Bloc showes: "Unexpected null value"

Advertisements

im trying to develop a Loginscreen in Flutter and im using Bloc(7.3.3) as my Statemanagement. When im loading the screen i get the following error:

======== Exception caught by widgets library =======================================================
The following TypeErrorImpl was thrown building BlocBuilder<LoginBloc, LoginState>(dirty, dependencies: [_InheritedProviderScope<LoginBloc?>, MediaQuery], state: _BlocBuilderBaseState<LoginBloc, LoginState>#700e3):
Unexpected null value.

The relevant error-causing widget was: 
  BlocBuilder<LoginBloc, LoginState> BlocBuilder:file:///<PATH>/lib/ui/login/login.dart:73:12
When the exception was thrown, this was the stack: 
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 251:49      throw_
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 528:63  nullCheck
packages/moena_administration/ui/login/login.dart 130:66                                                                       <fn>
packages/flutter_bloc/src/bloc_builder.dart 89:57                                                                              build
packages/flutter_bloc/src/bloc_builder.dart 165:21                                                                             build
packages/flutter/src/widgets/framework.dart 4705:27                                                                            build
packages/flutter/src/widgets/framework.dart 4588:15                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4763:11                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4311:5                                                                             rebuild
packages/flutter/src/widgets/framework.dart 4566:5                                                                             [_firstBuild]
packages/flutter/src/widgets/framework.dart 4754:11                                                                            [_firstBuild]
packages/flutter/src/widgets/framework.dart 4561:5                                                                             mount
packages/flutter/src/widgets/framework.dart 3631:13                                                                            inflateWidget
packages/flutter/src/widgets/framework.dart 3383:18                                                                            updateChild
packages/flutter/src/widgets/framework.dart 4613:16                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4763:11                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4311:5                                                                             rebuild
packages/flutter/src/widgets/framework.dart 4566:5                                                                             [_firstBuild]
packages/flutter/src/widgets/framework.dart 4754:11                                                                            [_firstBuild]
packages/flutter/src/widgets/framework.dart 4561:5                                                                             mount
packages/flutter/src/widgets/framework.dart 3631:13                                                                            inflateWidget
packages/flutter/src/widgets/framework.dart 3380:20                                                                            updateChild
packages/flutter/src/widgets/framework.dart 4613:16                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4763:11                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4311:5                                                                             rebuild
packages/flutter/src/widgets/framework.dart 4795:5                                                                             update
packages/flutter/src/widgets/framework.dart 3370:14                                                                            updateChild
packages/flutter/src/widgets/framework.dart 4613:16                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4763:11                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4311:5                                                                             rebuild
packages/flutter/src/widgets/framework.dart 2578:31                                                                            buildScope
packages/flutter/src/widgets/binding.dart 882:9                                                                                drawFrame
packages/flutter/src/rendering/binding.dart 363:5                                                                              [_handlePersistentFrameCallback]
packages/flutter/src/scheduler/binding.dart 1145:15                                                                            [_invokeFrameCallback]
packages/flutter/src/scheduler/binding.dart 1082:9                                                                             handleDrawFrame
packages/flutter/src/scheduler/binding.dart 863:7                                                                              <fn>
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/isolate_helper.dart 48:19           internalCallback
====================================================================================================

After this error, which is only visible for about half a second, the login screen loads and everything seems to work. I have no idea what this could be. Therefore I have simply times parts of my class and my Bloc attached. Maybe one of you has an idea what there with me somehow nachläd or how this error can arise.

LoginBloc:

part 'login_event.dart';
part 'login_state.dart';

class LoginBloc extends Bloc<LoginEvent, LoginState> {
  final FlutterSecureStorage storage = const FlutterSecureStorage();
  late BasicAuth userRepository;
  LoginBloc() : super(LoginInitial()) {
    userRepository = BasicAuth();
  }
  @override
  Stream<LoginState> mapEventToState(
    LoginEvent event,
  ) async* {
    if (event is LoginButtonPressed) {
      try {
        yield LoginLoading();
        Response response = await userRepository.authenticate(
            password: event.password, username: event.username);
        if (response.isSuccessful) {
          await storage.write(key: 'token', value: response.body['token']);
          BlocProvider.of<AuthenticationBloc>(event.context)
              .add(LoginSuccessFull());
          yield LoggedIn();
        } else {
          snackBar(context: event.context, message: response.error as String);
          yield LoginFail();
        }
      } on Exception catch (e) {
        snackBar(context: event.context, message: e.toString());
        yield LoginFail();
      }
    }
  }
}

LoginScreen:

class Login extends StatefulWidget {
  const Login({Key? key}) : super(key: key);

  @override
  _LoginState createState() => _LoginState();
}

class _LoginState extends State<Login> {
  TextEditingController emailController = TextEditingController();
  TextEditingController passwordController = TextEditingController();

  final FocusNode _focus = FocusNode();

  rive.Artboard? _riveArtboard;
  rive.StateMachineController? _controller;
  rive.SMIInput<double>? _state;
  rive.SMIInput<double>? _loading;

  @override
  void initState() {
    super.initState();
    rootBundle.load('<File>').then(
      (data) async {
        // Load the RiveFile from the binary data.
        final file = rive.RiveFile.import(data);

        final artboard = file.mainArtboard;
        var controller = rive.StateMachineController.fromArtboard(
            artboard, '<Statemachine>');
        if (controller != null) {
          artboard.addController(controller);
          _state = controller.findInput('State');
          _state?.value = 0;
          _loading = controller.findInput('loading');
        }
        setState(() => _riveArtboard = artboard);
      },
    );
    _focus.addListener(_onFocusChange);
  }

  @override
  void dispose() {
    _focus.removeListener(_onFocusChange);
    _focus.dispose();
  }

  void _onFocusChange() {
    if (_focus.hasFocus) {
      _state?.value = 1;
    } else {
      _state?.value = 0;
    }
  }

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<LoginBloc, LoginState>(builder: (context, state) {
      return Scaffold(
    resizeToAvoidBottomInset: false,
    backgroundColor: Colors.white,
    body: Stack(
      fit: StackFit.expand,
      alignment: Alignment.bottomCenter,
      children: [
        Stack(
          children: [
            Positioned(
              top: 20,
              left: 20,
              right: 20,
              child: Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Image.asset(
                    '/images/moena.png',
                    height: 80,
                  ),
                ],
              ),
            ),
            Positioned.fill(
              child: Align(
                alignment: Alignment.center,
                child: Container(
                    height: MediaQuery.of(context).size.height * 0.62,
                    margin: EdgeInsets.fromLTRB(
                        MediaQuery.of(context).size.width * 0.15,
                        20,
                        MediaQuery.of(context).size.width * 0.15,
                        20),
                    padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),
                    decoration: BoxDecoration(
                        borderRadius:
                            const BorderRadius.all(Radius.circular(10)),
                        color: Colors.white,
                        boxShadow: [
                          BoxShadow(
                              color: Colors.grey[300]!,
                              blurRadius: 5,
                              spreadRadius: 2)
                        ]),
                    child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                        children: [
                          Expanded(
                            child: Column(
                              mainAxisSize: MainAxisSize.min,
                              children: [
                                Center(
                                  child: SizedBox(
                                    width: 300,
                                    height: 300,
                                    child: rive.Rive(
                                      artboard: _riveArtboard!,
                                    ),
                                  ),
                                ),
                              ],
                            ),
                          ),

Thanks very much for helping 🙂

>Solution :

This is crashing because _riveArtboard is being accessed before it is getting initialised. To fix this use following code null check :

         Expanded(
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                  Center(
                  child: SizedBox(
                    width: 300,
                    height: 300,
                    child: rive.Rive(
                      artboard: _riveArtboard!,
                    ),
                  ),
                ),
              ],
            ),
          ),

or show progressIndicator :

Expanded(
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                Center(
                  child: SizedBox(
                    width: 300,
                    height: 300,
                    child: _riveArtboard != null
                        ? rive.Rive(
                            artboard: _riveArtboard!,
                          )
                    : ProgressIndicator(width:30,height:30),
                  ),
                ),
              ],
            ),
          ),

Leave a ReplyCancel reply