Flutter 颤振验证(集团模式和rxDart)
我想在BLoC partner上创建具有授权的应用程序,但遇到错误:Flutter 颤振验证(集团模式和rxDart),flutter,rxdart,bloc,Flutter,Rxdart,Bloc,我想在BLoC partner上创建具有授权的应用程序,但遇到错误: The following NoSuchMethodError was thrown building AuhtScreen(dirty, state: _AuhtScreenState<dynamic>#00539): The getter 'blocState' was called on null. Receiver: null Tried calling: blocState 在BlocProvider中
The following NoSuchMethodError was thrown building AuhtScreen(dirty, state: _AuhtScreenState<dynamic>#00539):
The getter 'blocState' was called on null.
Receiver: null
Tried calling: blocState
在BlocProvider中
static BlocState of(BuildContext context) { (context = StatefulElement)
return (context.inheritFromWidgetOfExactType(BlocProvider) as BlocProvider).blocState; (context = StatefulElement)(NULL)
}
我不明白为什么它不起作用,我做的每件事都是正确的,也许我错过了什么或者不明白。。。帮助解决问题
所有代码:
AuthBloc
授权服务
导入'dart:async';
导入“包装:mifity/models/auht_detail.dart”;
导入“包:mifity/models/error.dart”;
导入“包:mifity/models/user.dart”;
类身份验证服务{
未来登录用户(AuhtDetail)异步{
等待未来。延迟(持续时间(秒:1));//模拟网络延迟
如果(detail.email=='johndoe@acme.com'&&detail.password=='1234'){
返回用户(
id:1,
姓名:“约翰·多伊”,
电邮:'johndoe@acme.com',
年龄:26,,
profilePic:“john_doe.png”);
}否则{
抛出ClientError(消息:“登录详细信息不正确”);
}
}
}
验证器:
类验证程序{
字符串验证邮件(字符串值){
如果(value.isEmpty)返回“电子邮件不应为空”;
final RegExp emailRegEx=new RegExp(r'^\w+@[a-zA-Z\+?\[a-zA-Z]{2,3}$');
如果(!emailRegEx.hasMatch(value))返回“您的电子邮件无效”;
返回null;
}
字符串验证密码(字符串值){
如果(value.length<4)返回“密码应为四个或更多字符”;
返回null;
}
}
大屏幕
AuthBloc authBloc = BlocProvider.of(context).authBloc; (context = StatefulElement)
导入“包装:颤振/材料.省道”;
导入“package:mifity/blocs/auth_bloc.dart”;
导入“package:mifity/blocs/bloc_provider.dart”;
导入“package:mifity/helpers/validators.dart”;
类AuhtScreen扩展StatefulWidget{
@凌驾
_AuhtScreenState createState()=>AuhtScreenState();
}
类_AuhtScreenState扩展状态{
TextEditingController emailController=TextEditingController();
TextEditingController密码控制器=TextEditingController();
Validator Validator=新验证器();
final formKey=GlobalKey();
DecorationImage backgroundImage=新DecorationImage(
图片:新的ExactAssetTime('assets/images/bg_image.jpg'),
适合:BoxFit.cover,
);
@凌驾
小部件构建(构建上下文){
AuthBloc AuthBloc=BlocProvider.of(context).AuthBloc;
最终大小screenSize=MediaQuery.of(context.Size);
返回脚手架(
appBar:appBar(
标题:文本(“登录”),
),
body:Builder(Builder:(上下文){
返回SingleChildScrollView(
子:容器(
高度:screenSize.height-AppBar().preferredSize.height,
填充:所有边缘设置(10.0),
对齐:对齐.center,
装饰:盒子装饰(
image:(backgroundImage!=null)?backgroundImage:null),
儿童:中心(
孩子:表格(
key:formKey,
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
TextFormField(
样式:TextStyle(颜色:Colors.white),
控制器:emailController,
装饰:输入装饰(
labelText:“电子邮件”,
labelStyle:TextStyle(颜色:Colors.grey)),
验证器:validator.validateEmail,
),
TextFormField(
样式:TextStyle(颜色:Colors.white),
控制器:密码控制器,
装饰:输入装饰(
labelText:“密码”,
labelStyle:TextStyle(颜色:Colors.grey)),
蒙昧文字:对,
validator:validator.validatePassword,
),
大小盒子(
身高:20.0,
),
StreamBuilder(
initialData:false,
流:authBloc.loading,
生成器:(上下文,加载快照){
返回大小框(
宽度:double.infinity,
孩子:升起按钮(
颜色:颜色。深橙色,
textColor:Colors.white,
子项:文本((loadingSnapshot.data)
“登录…”
:“登录”),
已按下:(){
_提交(上下文、authBloc);
},
),
);
},
),
],
),
),
),
),
);
}));
}
_提交(上下文,AuthBloc AuthBloc){
emailChanged(emailController.text);
authBloc.passwordChanged(passwordController.text);
if(formKey.currentState.validate()){
authBloc.submitLogin(上下文);
}
}
}
我是个白痴!)
MyApp:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
child: MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new AuhtScreen(),
));
}
}
我是个白痴!)
MyApp:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
child: MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new AuhtScreen(),
));
}
}
您是否在小部件层次结构的某个位置插入了BlocProvider?@Luksprog提供的所有代码都不是多余的。您是否在小部件层次结构的某个位置插入了BlocProvider?@Luksprog提供的所有代码都不是多余的。
import 'dart:async';
import 'package:mifity/models/auht_detail.dart';
import 'package:mifity/models/error.dart';
import 'package:mifity/models/user.dart';
class AuthService {
Future<User> loginUser(AuhtDetail detail) async {
await Future.delayed(Duration(seconds: 1)); //simulate network delay
if (detail.email == 'johndoe@acme.com' && detail.password == '1234') {
return User(
id: 1,
name: 'John Doe',
email: 'johndoe@acme.com',
age: 26,
profilePic: 'john_doe.png');
} else {
throw ClientError(message: 'login details incorrect.');
}
}
}
class Validator {
String validateEmail(String value) {
if (value.isEmpty) return 'Email Should not be empty';
final RegExp emailRegEx = new RegExp(r'^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$');
if (!emailRegEx.hasMatch(value)) return 'Your Email is invalid';
return null;
}
String validatePassword(String value) {
if (value.length < 4) return 'Password should be four characters or more';
return null;
}
}
import 'package:flutter/material.dart';
import 'package:mifity/blocs/auth_bloc.dart';
import 'package:mifity/blocs/bloc_provider.dart';
import 'package:mifity/helpers/validators.dart';
class AuhtScreen extends StatefulWidget {
@override
_AuhtScreenState createState() => _AuhtScreenState();
}
class _AuhtScreenState<StateClass> extends State<AuhtScreen> {
TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();
Validator validator = new Validator();
final formKey = GlobalKey<FormState>();
DecorationImage backgroundImage = new DecorationImage(
image: new ExactAssetImage('assets/images/bg_image.jpg'),
fit: BoxFit.cover,
);
@override
Widget build(BuildContext context) {
AuthBloc authBloc = BlocProvider.of(context).authBloc;
final Size screenSize = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
title: Text('Login'),
),
body: Builder(builder: (context) {
return SingleChildScrollView(
child: Container(
height: screenSize.height - AppBar().preferredSize.height,
padding: EdgeInsets.all(10.0),
alignment: Alignment.center,
decoration: BoxDecoration(
image: (backgroundImage != null) ? backgroundImage : null),
child: Center(
child: Form(
key: formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextFormField(
style: TextStyle(color: Colors.white),
controller: emailController,
decoration: InputDecoration(
labelText: 'email',
labelStyle: TextStyle(color: Colors.grey)),
validator: validator.validateEmail,
),
TextFormField(
style: TextStyle(color: Colors.white),
controller: passwordController,
decoration: InputDecoration(
labelText: 'password',
labelStyle: TextStyle(color: Colors.grey)),
obscureText: true,
validator: validator.validatePassword,
),
SizedBox(
height: 20.0,
),
StreamBuilder<bool>(
initialData: false,
stream: authBloc.loading,
builder: (context, loadingSnapshot) {
return SizedBox(
width: double.infinity,
child: RaisedButton(
color: Colors.deepOrange,
textColor: Colors.white,
child: Text((loadingSnapshot.data)
? 'Login ...'
: 'Login'),
onPressed: () {
_submit(context, authBloc);
},
),
);
},
),
],
),
),
),
),
);
}));
}
_submit(context, AuthBloc authBloc) {
authBloc.emailChanged(emailController.text);
authBloc.passwordChanged(passwordController.text);
if (formKey.currentState.validate()) {
authBloc.submitLogin(context);
}
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
child: MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new AuhtScreen(),
));
}
}