Flutter 颤振验证(集团模式和rxDart)

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中

我想在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中

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