Flutter Get-NoSuchMethodError(NoSuchMethodError:在flift中产生新状态后,在null上调用了方法调用

Flutter Get-NoSuchMethodError(NoSuchMethodError:在flift中产生新状态后,在null上调用了方法调用,flutter,bloc,Flutter,Bloc,在Flatter中将新事件添加到我的bloc时出错。 第一次没问题,但第二次我遇到这个错误: The following NoSuchMethodError was thrown while handling a gesture: The method 'call' was called on null. Receiver: null Tried calling: call() 我将LoginEvent添加到bloc中,在这种情况下,我生成LoadingState 第一次可以,但第二次不行 这

在Flatter中将新事件添加到我的bloc时出错。 第一次没问题,但第二次我遇到这个错误:

The following NoSuchMethodError was thrown while handling a gesture:
The method 'call' was called on null.
Receiver: null
Tried calling: call()
我将
LoginEvent
添加到bloc中,在这种情况下,我生成LoadingState

第一次可以,但第二次不行

这是我的屏幕:

class _AuthScreenState extends State<AuthScreen> {
  final AuthRepository repository = AuthRepository();
  PageController controller;

  @override
  void initState() {
    controller = PageController(initialPage: widget.page);
    super.initState();
  }

  void changePage(int page) {
    controller.animateToPage(
      page,
      curve: Curves.ease,
      duration: Duration(milliseconds: 300),
    );
  }

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => AuthBloc(repository: repository),
      child: BlocBuilder<AuthBloc, AuthState>(
        builder: (context, state) {
          return ScreenContainer(
            pb: 25.0,
            withTapDetector: true,
            statusbarcolor: ColorPalette.primary,
            statusBarIconBrightness: Brightness.light,
            resizeToAvoidBottomPadding: false,
            removeAppbar: true,
            // loading: state is LoadingState,
            child: Container(
              width: double.infinity,
              height: double.infinity,
              child: Column(
                children: [
                  Expanded(
                    child: PageView.builder(
                      controller: controller,
                      physics: NeverScrollableScrollPhysics(),
                      itemCount: 2,
                      itemBuilder: (context, position) {
                        return position == 0
                            ? LoginPage(
                                onPageChange: () => changePage(1),
                                onSubmit: (req) => context.bloc<AuthBloc>().add(LoginEvent(req: req)),
                              )
                            : RegisterPage(
                                onPageChange: () => changePage(0),
                              );
                      },
                    ),
                  ),
                  googleLogin(context),
                ],
              ),
            ),
          );
        },
      ),
    );
  }
}
class\u AuthScreenState扩展状态{
最终AuthRepository repository=AuthRepository();
页面控制器;
@凌驾
void initState(){
控制器=页面控制器(初始页面:widget.page);
super.initState();
}
无效更改页(整版页){
controller.animateToPage(
页
曲线:曲线,
持续时间:持续时间(毫秒:300),
);
}
@凌驾
小部件构建(构建上下文){
返回BlocProvider(
创建:(上下文)=>AuthBloc(存储库:存储库),
孩子:BlocBuilder(
生成器:(上下文、状态){
返回屏幕容器(
pb:25.0,
withTapDetector:正确,
statusbarcolor:ColorPalette.primary,
statusBarIconBrightness:Brightness.light,
resizeToAvoidBottomPadding:false,
removeAppbar:是的,
//正在加载:状态为LoadingState,
子:容器(
宽度:double.infinity,
高度:双无限,
子:列(
儿童:[
扩大(
子项:PageView.builder(
控制器:控制器,
物理学:NeverscrollableScroll物理学(),
物品计数:2,
itemBuilder:(上下文、位置){
返回位置==0
?登录页面(
onPageChange:()=>changePage(1),
onSubmit:(req)=>context.bloc().add(LoginEvent(req:req)),
)
:注册网页(
onPageChange:()=>changePage(0),
);
},
),
),
谷歌登录(上下文),
],
),
),
);
},
),
);
}
}
这是我的阵营:

class AuthBloc extends Bloc<AuthEvent, AuthState> {
  final AuthRepository repository;
  AuthBloc({
    @required this.repository,
  }) : super(InitialState());

  @override
  Stream<AuthState> mapEventToState(
    AuthEvent event,
  ) async* {
    if (event is RegisterEvent) {
      yield* _mapRegisterEventToState(event.req);
    } else if (event is LoginEvent) {
      yield* _mapLoginEventToState(event.req);
    }
  }

  Stream<AuthState> _mapRegisterEventToState(AuthReq req) async* {}

  Stream<AuthState> _mapLoginEventToState(AuthReq req) async* {
    yield LoadingState();
  }
}
class AuthBloc扩展了Bloc{
最终授权存储库;
AuthBloc({
@需要此存储库,
}):super(InitialState());
@凌驾
流映射事件状态(
AuthEvent事件,
)异步*{
如果(事件为RegisterEvent){
产量*\u映射RegisterEventState(event.req);
}else if(事件为LoginEvent){
产生*_mapLoginEventToState(event.req);
}
}
流_-MapRegisterEventState(AuthReq-req)异步*{}
流_mapLoginEventToState(AuthReq)异步*{
屈服载荷状态();
}
}

您的代码中有两个错误:

  • 您应该始终在try-catch中编写bloc事件状态代码,这样在bloc收到一些错误后,代码就会变得健壮
  • 您没有监听构建方法中的任何更改,并且总是处理默认值。我认为这将帮助您摆脱一次性构建错误
  • 返回BlocProvider(
    创建:(上下文)=>AuthBloc(存储库:存储库),
    孩子:BlocBuilder(
    生成器:(上下文、状态){
    如果(状态为State1){
    return SocialMediaScreen()
    }else if(状态为State2){
    返回全喷丝头屏幕()
    }否则{
    返回初始屏幕()
    }
    }
    
    )
    我的bloc事件状态为try-catch,我只是显示出错的部分。我在屏幕中使用state,我只是对其进行注释。尝试为bloc创建一个类级变量,并将其传递给小部件树