微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 null 上调用了 getter 'data'接收者:空尝试调用:数据

如何解决在 null 上调用了 getter 'data'接收者:空尝试调用:数据

尝试使用 Firebase 注册用户,但出现上述错误,并且代码的格式设置为在成功注册后应将用户重定向到主页。

我的 main.dart

import 'package:bedc_app/home_page.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:Flutter/material.dart';
import 'package:bedc_app/auth/login_page.dart';

void main() async{
  //solution study

  WidgetsFlutterBinding.ensureInitialized();
  FirebaseAuth.instance.currentUser()
  .then((FirebaseUser user) {
    if(user != null){
      Firestore.instance.collection('users').document(user.uid).get().then((DocumentSnapshot doc){
        runApp(MyApp(true,doc));
      });
      return;
    }

    runApp(MyApp(false,null));
  });

}


// void main() =>runApp(MyApp());


class MyApp extends StatelessWidget {
  bool isLoggedIn;
  DocumentSnapshot doc;

  MyApp(this.isLoggedIn,this.doc);


  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My Multifunctional bedc project App',debugShowCheckedModeBanner: false,home: isLoggedIn ? HomePage(userDoc: doc) : loginPage(),);
  }
}

我的 Signup_page.dart

    import 'package:bedc_app/auth/login_page.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:Flutter/cupertino.dart';
import 'package:Flutter/gestures.dart';
import 'package:Flutter/material.dart';

import 'package:bedc_app/utils/constants.dart';

import '../home_page.dart';


class SignUpPage extends StatefulWidget {
  @override
  _SignUpPageState createState() => _SignUpPageState();
}

class _SignUpPageState extends State<SignUpPage> {

  String email,password;

  bool isLoggedIn = false;


  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.white,body: ListView(
                children: [
                  SizedBox(
                    height: 50,),Align(
                    alignment: Alignment.topCenter,child: (
                    Image.asset(
                      'assets/bedclogo.jpg'
                    )),SizedBox(
                    height: 100,Padding(
                      padding: EdgeInsets.symmetric(horizontal: 26.0),child: TextField(
                        decoration: Inputdecoration(
                          hintText: 'email',border: OutlineInputBorder(),labelText: 'Email',suffixIcon: Icon(Icons.email,color: Colors.green)
                        ),keyboardType: TextInputType.emailAddress,onChanged: (String val){
                          email = val;
                        },SizedBox(
                    height: 10,Padding(
                    padding: EdgeInsets.symmetric(horizontal: 26.0),child: TextField(
                      decoration: Inputdecoration(
                          hintText: 'Password',labelText: 'Password',suffixIcon: Icon(Icons.lock,color: Colors.green)
                      ),obscureText: true,obscuringCharacter: '!',onChanged: (String val){
                        password = val;
                      },SizedBox(
                    height: 5,Padding(
                    padding: EdgeInsets.symmetric(horizontal: 26),child: MaterialButton(
                      color: Color(0xFF88C540),child: isLoading ? Container(
                          height: 24,width: 24,child: CircularProgressIndicator(
                            valueColor: AlwaysstoppedAnimation<Color>(Colors.black),strokeWidth: 2,)
                      ):Text(
                        'SignUp'.toupperCase(),style: TextStyle(fontWeight: FontWeight.bold),onpressed: (){
                          checkUserinput();
                      },Padding(
                    padding: EdgeInsets.symmetric(horizontal: 20),child: RichText(
                        text: TextSpan(
                            text: 'Already have an Account ?',style: TextStyle(color: Colors.black),children: [
                              TextSpan(
                                text: 'Login here',style: TextStyle(color: Colors.blue),recognizer: TapGestureRecognizer()..onTap = (){
                                  Navigator.of(context).pushReplacement(CupertinopageRoute(builder: (_) => loginPage()));
                                },)
                            ]
                        )),)
                ],));
  }

  //SIGNUP FUNCTION USING FIREBASE
  bool isLoading = false;
  signUpUserWithFirebase(){
    FirebaseAuth.instance.createuserWithEmailAndPassword(
        email: email,password: password
    ).then((AuthResult result){

      //Authresult cant be stored to string.....
      storeUserDataToFirestore(result.user.uid);
      if(result.user.uid != null){
        Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (_) => HomePage()));
      }
    }).catchError((e){
      print(e);
      isLoading = false;
      setState(() { });

    });
  }

  //storeUserDataToFirestore
  storeUserDataToFirestore(String userId){
            Map<String,dynamic> userData = Map<String,dynamic>();

            userData = {
              Constants.USERNAME: '@username',Constants.USER_ID: userId,Constants.EMAIL : email,Constants.ACCOUNT_NUM : '00000000',Constants.IS_ADMIN: false,Constants.PROFILE_IMAGE: '',Constants.PROFILE_IMAGE_THUMB: '',};

          CollectionReference usersRef = Firestore.instance.collection(Constants.USERS_COLLECTION);
          usersRef.document(userId).setData(userData).then((_){
            isLoading = false;
            setState(() { });
          }).catchError((e){
            print(e);
          });
  }
//FUNCTION TO CHECK USER ENTRY
  checkUserinput(){
      isLoading = true;
      setState(() { });

      if(email == null || email.isEmpty){
        print('Enter email');
        isLoading = false;
        setState(() { });
        return;
      }

      if(password == null || email.isEmpty){
        print('Enter password');
        isLoading = false;
        setState(() { });
      }

      //SIGNUP THE USER
        signUpUserWithFirebase();
  }

  getUserData(String UserId){
    Firestore.instance.collection(Constants.USERS_COLLECTION)
        .document(UserId)
        .get().then((DocumentSnapshot userDoc){
        Navigator.of(context).pop();
        Navigator.of(context).pushReplacement(CupertinopageRoute(builder: (_) => HomePage(userDoc: userDoc)));
    }).catchError((e){
        print(e);
    });

  }

}

我的主页_page.dart

import 'dart:ui';

import 'package:bedc_app/auth/login_page.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:Flutter/material.dart';
import 'package:Flutter/cupertino.dart';
import 'package:bedc_app/auth/signup_page.dart';

import 'model/user.dart';


User currentUser;
class HomePage extends StatefulWidget {

  DocumentSnapshot userDoc;

  HomePage({this.userDoc,});

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

//user cant access this page unless logged in

  bool userIsLoggedIn = true;
  @override
  void initState() {
    // Todo: implement initState
    super.initState();

    currentUser = User.fromSnapshot(widget.userDoc);
  }
//HERE IS BUILDING PROFILE IMAGE
  Widget buildProfileImage(){
      if(currentUser.profileImage == ''){
        return CircleAvatar(
          backgroundColor: Colors.white70,radius: 20,child: Icon(Icons.person,size: 30),);
      }else{
        return CircleAvatar(
              backgroundImage: NetworkImage(currentUser.profileImage),);
      }
  }

    Widget build(BuildContext context) {
      return Scaffold(
          appBar: AppBar(
            automaticallyImplyLeading: false,backgroundColor: Colors.brown,title: Text('Homepage'),body: ListView(
            children: [
                 SizedBox(height: 20),Align(
                alignment: Alignment.topRight,child: (
                    Image.asset(
                        'assets/bedclogo.jpg',scale: 2,)),ListTile(
                title: Text(currentUser.username,style: TextStyle(color: Colors.brown,fontWeight: FontWeight.bold),leading: buildProfileImage(),SizedBox(height: 30),//CAPTURE METER READING UI
              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 20.0),child: GestureDetector(
                  onTap: (){
                    //print(currentUser.isAdmin);
                  },child: Row(
                    children: [

                      //CAPTURE METR READING
                      Container(
                        width: 100,height: 100,color: Colors.green,child: Align(
                                    alignment: Alignment.center,child: (
                                        Image.asset(
                                          'assets/meterIcon.png',scale: 3,Container(
                        width: 100,child: Align(
                          alignment: Alignment.center,child: Text('Capture Meter Reading'.toupperCase()),],//UPDATE PROFILE UI DESIGN

              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 20.0),child: GestureDetector(
                  onTap:(){
                    //print(currentUser.isAdmin);
                  },child: Row(
                    children: [


                      Container(
                        width: 100,child: (
                              Image.asset(
                                'assets/profileAvatar.png',child: Text('Update Profile'.toupperCase()),//               TextButton (
//                   onpressed: (){
//                     //just logout,implement pop dialog later
//                     // FirebaseAuth.instance.signOut();
//                     // Navigator.of(context).pushReplacement(CupertinopageRoute(builder: (_)=> loginPage()));
//                     // currentUser = null;
//                     // setState(() {
//                     // });
// // still showing error... try to fix asap
//                     FirebaseAuth.instance.signOut().then((_){
//                       userIsLoggedIn = false;
//                       Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (_)=> loginPage()));
//                       //currentUser = null;
//                       setState(() {
//
//                       });
//                     });
//                   },//                   child: Text('SignOut'))

            ],)
      );
    }
  }

用户模型的 User.dart

import 'package:bedc_app/utils/constants.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class User{
String username;
String email;
String userId;
String accountNum;
bool isAdmin;
String profileImage;
String profileImageThumb;

User({
  this.username,this.email,this.userId,this.accountNum,this.isAdmin,this.profileImage,this.profileImageThumb
});

factory User.fromSnapshot(DocumentSnapshot doc){

  return User(
      username: doc.data[Constants.USERNAME],email: doc.data[Constants.EMAIL],userId: doc.data[Constants.USER_ID],accountNum: doc.data[Constants.ACCOUNT_NUM],isAdmin: doc.data[Constants.IS_ADMIN],profileImage: doc.data[Constants.PROFILE_IMAGE],profileImageThumb: doc.data[Constants.PROFILE_IMAGE_THUMB]
  );
}

}

用户注册后,我收到错误 getter 'data' 被调用为 null。接收者:空尝试调用:数据。

我不知道是代码的哪一部分导致了这个异常

解决方法

当您尝试获取空对象的某些属性时,通常会出现此错误

在您的情况下,调用文件 User.dart 中的 doc.data[..] 之一会生成错误,这意味着 { {1}} 是真的。

在 Home_page.dart 文件的 initState 方法

上验证此行 doc == null 处的 widget.userDoc 不为空

因此,在需要非空 userDoc 的 HomePage 调用之一中提供错误(待办事项:使用断言确保您的数据不为空,并在类 exp 上的必需变量之前添加 currentUser = User.fromSnapshot(widget.userDoc);:{{1 }} 在您调试应用程序时非常有用)

最终您的问题在您的 Signup_page.dart 文件的 @required 方法中提供...这里HomePage({@required this.userDoc,}): assert(userDoc != null,"BOooh my userDoc may be not null");

尝试用这个 signUpUserWithFirebase() 替换,这样你的方法应该变成

Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (_) => HomePage()));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。