Reputation: 73
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 is reloading there 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(
'<Filename>',
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 :)
Upvotes: 2
Views: 1631
Reputation: 2727
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),
),
),
],
),
),
Upvotes: 2