Flutter Bloc 显示 : "Unexpected null value"

标签 flutter dart bloc

我正在尝试在 Flutter 中开发登录屏幕,并使用 Bloc(7.3.3) 作为我的状态管理。当我加载屏幕时,出现以下错误:

======== 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
====================================================================================================

出现此错误(仅可见约半秒)后,登录屏幕将加载,并且一切似乎都正常。我不知道这可能是什么。因此,我只是附上了我的类(class)和我的 Bloc 的部分时间。也许你们中的一个人知道那里正在重新加载什么或者如何出现此错误。

登录 block :

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();
      }
    }
  }
}

登录屏幕:

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!,
                                    ),
                                  ),
                                ),
                              ],
                            ),
                          ),

非常感谢您的帮助:)

最佳答案

这会崩溃,因为 _riveArtboard 在初始化之前就被访问了。要解决此问题,请使用以下代码空检查:

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

或显示进度指示器:

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),
                  ),
                ),
              ],
            ),
          ),

关于Flutter Bloc 显示 : "Unexpected null value",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70580268/

相关文章:

size - 如何在 flutter 中的不同屏幕分辨率之间具有相同大小的圆圈比例

flutter - Dart 删除方括号并添加单引号

asynchronous - flutter 和 bloc 异步yield

dart - StreamBuilder TextField 在其他地方更改时不会更新其值

flutter - 如何在 flutter 的两个不同屏幕上使用同一个 bloc?

flutter - 如何减少flutter web应用程序的加载时间

flutter - 自定义 float 底部导航栏有白色背景 flutter

dart - 如何将卡片放入 sliver 应用栏

android - 如何在 flutter 中从 UST 获取本地时间

flutter - 如何在 Flutter 中创建粘性商店按钮动画?