在空值(接收者:空值)上调用了吸气剂“ storeNumber”

时间:2018-07-13 16:20:04

标签: dart flutter

我正在尝试将数据从一个屏幕传递到另一个屏幕,但是我一直收到null异常。每当我在第一个屏幕上填写表格并进入下一个屏幕时,我都会得到一个“

  

NoSuchMethodError:在空值上调用了吸气剂“ storeNumber”

`

我的变量类是==>此实体类具有使用以下类中的表单填充的变量:

class StoreData {
  String _storeNumber;
  String _repName;
  String _repCell;
  DateTime _transactionDate = new DateTime.now();

  StoreData(
      this._storeNumber, this._repName, this._repCell, this._transactionDate);

  String get storeNumber => _storeNumber;

  set storeNumber(String value) {
    _storeNumber = value;
  }

  String get repName => _repName;

  DateTime get transactionDate => _transactionDate;

  set transactionDate(DateTime value) {
    _transactionDate = value;
  }

  String get repCell => _repCell;

  set repCell(String value) {
    _repCell = value;
  }

  set repName(String value) {
    _repName = value;
  }
}

主类(在这种情况下,这是将数据发送到第二个屏幕的第一个屏幕)包括以下代码: 此类的形式为接受3个输入并将其发送到第二个屏幕。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

import 'FeedBack.dart';
import 'StoreData.dart';

void main() {
  runApp(MaterialApp(
    title: 'Navigation Basics',
    home: FirstScreen(),
  ));
}

//get our entity class
StoreData storeDate;

// get variables from entity class
String storeNumber = storeDate.storeNumber;
String repName = storeDate.repName;
String repCell = storeDate.repCell;
DateTime transactionDate = storeDate.transactionDate;

class FirstScreen extends StatefulWidget {
  @override
  _FirstScreenState createState() => _FirstScreenState();
}

class _FirstScreenState extends State<FirstScreen> {
  GlobalKey<FormState> _key = GlobalKey();
  bool _validate = false;

  _sendData() {
    Navigator.push(
      context,
      MaterialPageRoute(
          builder: (context) => FeedBack(
              storeData: new StoreData(
                  storeNumber, repName, repCell, transactionDate))),
    );
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Test App'),
        ),
        body: new SingleChildScrollView(
          child: new Container(
            margin: new EdgeInsets.all(15.0),
            child: new Form(
              key: _key,
              autovalidate: _validate,
              child: formUI(),
            ),
          ),
        ),
      ),
    );
  }

  Widget formUI() {
    return new Column(
      children: <Widget>[
        new TextFormField(
            decoration: new InputDecoration(hintText: 'Store Number'),
            keyboardType: TextInputType.number,
            validator: validateRepCell,
            onSaved: (String val) {
              storeNumber = val;
            }),
        new TextFormField(
            decoration: new InputDecoration(hintText: 'Rep Full Name'),
            validator: validateRepName,
            onSaved: (String val) {
              repName = val;
            }),
        new TextFormField(
            decoration: new InputDecoration(hintText: 'Rep Phone Number'),
            keyboardType: TextInputType.number,
            validator: validateRepCell,
            onSaved: (String val) {
              repCell = val;
            }),
        new SizedBox(height: 15.0),
        new RaisedButton(
          onPressed: _sendData,
          child: new Text('Proceed'),
        )
      ],
    );
  }

// Validate Fields

  String validateRepCell(String value) {
    // String patttern = r'(^[a-zA-Z ]*$)';
    RegExp regExp = new RegExp(r'^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)$');
    if (value.length == 0) {
      return "Store Number  is Required";
    } else if (!regExp.hasMatch(value)) {
      return "Store Number must be only have numbers";
    }
    return null;
  }

  String validateRepName(String value) {
    String patttern = r'(^[a-zA-Z ]*$)';
    RegExp regExp = new RegExp(patttern);
    if (value.length == 0) {
      return "Rep Name is Required";
    } else if (!regExp.hasMatch(value)) {
      return "Name must be a-z and A-Z";
    }
    return null;
  }


}

第二个屏幕的代码在这里:

class FeedBack extends StatelessWidget {
  final StoreData storeData;

  FeedBack({Key key, @required this.storeData}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("FeedBack Screen"),
      ),
      body: new Container(
        child: new Column(
          children: <Widget>[
            new RaisedButton(
              onPressed: _sendToDatabase,
              child: new Text('Press Me'),
            ),
            new Text("${storeData.storeNumber}"),
          ],
        ),
      ),
    );
  }

  _sendToDatabase() {
    Firestore.instance.runTransaction((Transaction transaction) async {
      CollectionReference reference = Firestore.instance.collection('Stores');

      await reference.add({"test": "test", "testII": "test"});
    });
  }
}

我已经尝试解决这个问题一个星期了,但是鉴于我在Dart和Flutter框架上的新经验,这很难!

我们将不胜感激

1 个答案:

答案 0 :(得分:1)

您可以使用以下方法。

从代码中删除以下几行:

//get our entity class
StoreData storeDate;

起初,目前没有StoreData实例。

现在,声明新的变量,如下所示:

String storeNumber;
String repName;
String repCell;
DateTime transactionDate;

然后使用onSaved方法将表单值分配给它们。 因此,当您提交表单时,这些值将用于创建新的StoreData并将其传递到第二页。

这是main.dart文件的代码:

    import 'package:flutter/material.dart';

import 'FeedBack.dart';
import 'StoreData.dart';

void main() {
  runApp(MaterialApp(
    title: 'Navigation Basics',
    home: FirstScreen(),
  ));
}


// get variables from entity class
String storeNumber;
String repName;
String repCell;
DateTime transactionDate = DateTime.now();

class FirstScreen extends StatefulWidget {
  @override
  _FirstScreenState createState() => _FirstScreenState();
}

class _FirstScreenState extends State<FirstScreen> {
  GlobalKey<FormState> _key = GlobalKey();
  bool _validate = false;

  _sendData() {

    _key.currentState.save();

    Navigator.push(
      context,
      MaterialPageRoute(
          builder: (context) => FeedBack(
              storeData: StoreData(
                  storeNumber, repName, repCell, transactionDate))),
    );
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text('Test App'),
        ),
        body: new SingleChildScrollView(
          child: new Container(
            margin: new EdgeInsets.all(15.0),
            child: new Form(
              key: _key,
              autovalidate: _validate,
              child: formUI(),
            ),
          ),
        ),
      ),
    );
  }

  Widget formUI() {
    return new Column(
      children: <Widget>[
        new TextFormField(
            decoration: new InputDecoration(hintText: 'Store Number'),
            keyboardType: TextInputType.number,
            validator: validateRepCell,
            onSaved: (String val) {
              storeNumber = val;
            }),
        new TextFormField(
            decoration: new InputDecoration(hintText: 'Rep Full Name'),
            validator: validateRepName,
            onSaved: (String val) {
              repName = val;
            }),
        new TextFormField(
            decoration: new InputDecoration(hintText: 'Rep Phone Number'),
            keyboardType: TextInputType.number,
            validator: validateRepCell,
            onSaved: (String val) {
              repCell = val;
            }),
        new SizedBox(height: 15.0),
        new RaisedButton(
          onPressed: _sendData,
          child: new Text('Proceed'),
        )
      ],
    );
  }

// Validate Fields

  String validateRepCell(String value) {
    // String patttern = r'(^[a-zA-Z ]*$)';
    RegExp regExp = new RegExp(r'^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)$');
    if (value.length == 0) {
      return "Store Number  is Required";
    } else if (!regExp.hasMatch(value)) {
      return "Store Number must be only have numbers";
    }
    return null;
  }

  String validateRepName(String value) {
    String patttern = r'(^[a-zA-Z ]*$)';
    RegExp regExp = new RegExp(patttern);
    if (value.length == 0) {
      return "Rep Name is Required";
    } else if (!regExp.hasMatch(value)) {
      return "Name must be a-z and A-Z";
    }
    return null;
  }


}