Flutter Get-NoSuchMethodError(NoSuchMethodError:在flift中产生新状态后,在null上调用了方法调用
在Flatter中将新事件添加到我的bloc时出错。 第一次没问题,但第二次我遇到这个错误: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 第一次可以,但第二次不行 这
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)异步*{
屈服载荷状态();
}
}
您的代码中有两个错误:
返回BlocProvider(
创建:(上下文)=>AuthBloc(存储库:存储库),
孩子:BlocBuilder(
生成器:(上下文、状态){
如果(状态为State1){
return SocialMediaScreen()
}else if(状态为State2){
返回全喷丝头屏幕()
}否则{
返回初始屏幕()
}
}
)
我的bloc事件状态为try-catch,我只是显示出错的部分。我在屏幕中使用state,我只是对其进行注释。尝试为bloc创建一个类级变量,并将其传递给小部件树