无法从Firebase中的文本字段表单保存数据 [英] Unable to save the data from the textfields forms in the firebase

查看:79
本文介绍了无法从Firebase中的文本字段表单保存数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图发送电子邮件,并将用户输入的数据从flutter应用程序中保存到Firebase。

I was trying to send an email and save the user input data to the firebase from the flutter application.

我的代码确实:我创建了能够发送电子邮件的应用程序但我不得不将这些文本字段数据保存在Firebase中。
我已经在代码中实现了云存储,但是我遇到了很多错误。

My code does: I have created the application which is capable to send email but I have got stuck to save those text fields data in the firebase. I have implemented the cloud firestore in the code but I am getting quite a few errors.

我的代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Home(),
    );
  }
}

class Home extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _HomeState();
  }
}

class _HomeState extends State<Home> {
  var _emailFormKey = GlobalKey<FormState>();
  TextEditingController emailController = new TextEditingController();
  TextEditingController nameController = new TextEditingController();
  TextEditingController numberController = new TextEditingController();

  @override
  Widget build(BuildContext context) {
// TODO: implement build
    return Scaffold(
      resizeToAvoidBottomPadding: false,
      appBar: AppBar(
        title: Text("Email sending App"),
      ),
      body: Form(
        key: _emailFormKey,
        child: Column(
          children: <Widget>[
            Container(
              margin: EdgeInsets.only(top: 50.0, left: 15.0, right: 15.0),
              child: TextFormField(
                controller: emailController,
                validator: (value) {
                  if (value.isEmpty) {
                    return "please enter emailid";
                  }
                },
                decoration: InputDecoration(
                    labelText: "Enter email id",
                    border: OutlineInputBorder(
                        borderSide: BorderSide(
                      color: Colors.red,
                      width: 2.0,
                    ))),
              ),
            ),
            Container(
              margin: EdgeInsets.only(top: 15.0, left: 15.0, right: 15.0),
              child: TextFormField(
                controller: numberController,
                validator: (value) {
                  if (value.isEmpty) {
                    return "please enter number";
                  }
                },
                decoration: InputDecoration(
                    labelText: "Enter number",
                    border: OutlineInputBorder(
                        borderSide: BorderSide(
                      color: Colors.red,
                      width: 2.0,
                    ))),
              ),
            ),
            Container(
              margin: EdgeInsets.only(top: 15.0, left: 15.0, right: 15.0),
              child: TextFormField(
                controller: nameController,
                validator: (value) {
                  if (value.isEmpty) {
                    return "please Enter name";
                  }
                },
                decoration: InputDecoration(
                    labelText: "Enter name",
                    border: OutlineInputBorder(
                        borderSide: BorderSide(
                      color: Colors.red,
                      width: 2.0,
                    ))),
              ),
            ),
            Container(
              margin: EdgeInsets.only(top: 15.0),
              child: RaisedButton(
                  child: Text("Send"),
                  onPressed: () {
                    if (_emailFormKey.currentState.validate()) {
                      sendMessage();
                      //function to send data in the firebase
                      sendToServer();
                    }
                  }),
            )
          ],
        ),
      ),
    );
  }

  void sendMessage() {
    var PhoneNumber;
    String Name;
    String Emailid;
    Email email;
    setState(() {
      Emailid = emailController.text;
      Name = nameController.text;
      PhoneNumber = numberController.text;
      String messageBody = '$Name \n $PhoneNumber \n $Emailid';
      if (Name.isNotEmpty && Emailid.isNotEmpty && PhoneNumber.isNotEmpty) {
        email = Email(
          body: messageBody,
          subject: 'Email subject',
          recipients: ['onlineproductsking1@gmail.com'],
        );
        send(email);
        sendToServer() {
          if (_emailFormKey.currentState.validate()) {
            //No error in validator
            _emailFormKey.currentState.save();
            Firestore.instance.runTransaction((Transaction transaction) async {
              CollectionReference reference =
                  Firestore.instance.collection('contact');

              await reference.add({
                "Name": "$Name",
                "Phone Number": "$PhoneNumber",
                "Email Id": "$Emailid"
              });
            });
            // } else {
            //   // validation error
            //   setState(() {
            //           // _validate = true;
            //         });
            // }

          }
        }
      }
    });
    debugPrint('name -> $Name, number -> $PhoneNumber, emailid -> $Emailid');
  }

  void send(Email email) async {
    await FlutterEmailSender.send(email);
  }
}

错误消息:

Compiler message:
       ^
lib/contact_form.dart:107:23: Error: The method 'sendToServer' isn't defined for the class '_HomeState'.
 - '_HomeState' is from 'package:pdf/contact_form.dart' ('lib/contact_form.dart').
Try correcting the name to the name of an existing method, or defining a method named 'sendToServer'.
                      sendToServer();
                      ^^^^^^^^^^^^
lib/contact_form.dart:138:48: Error: 'Transaction' isn't a type.
            Firestore.instance.runTransaction((Transaction transaction) async {
                                               ^^^^^^^^^^^
lib/contact_form.dart:139:15: Error: 'CollectionReference' isn't a type.
              CollectionReference reference =
              ^^^^^^^^^^^^^^^^^^^
lib/contact_form.dart:138:13: Error: The getter 'Firestore' isn't defined for the class '_HomeState'.
 - '_HomeState' is from 'package:pdf/contact_form.dart' ('lib/contact_form.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'Firestore'.
            Firestore.instance.runTransaction((Transaction transaction) async {
            ^^^^^^^^^
lib/contact_form.dart:140:19: Error: The getter 'Firestore' isn't defined for the class '_HomeState'.
 - '_HomeState' is from 'package:pdf/contact_form.dart' ('lib/contact_form.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'Firestore'.
                  Firestore.instance.collection('books');
              ^^^^^^^^^

在10,491毫秒内重新启动应用程序。

Restarted application in 10,491ms.

请帮助我解决此问题,并提到我要去哪里哪里了。

Please help me resolve this issue and mentioned where was I going wrong.

推荐答案

setState 接受没有参数且不返回数据的voidCallback:

setState takes a voidCallback that have no arguments and doesn't return a data:

https://api.flutter.dev/flutter/widgets/State/setState.html

基本上是:

setState(() {
                           
});

基本上()是回调的no参数,而 {// ...} 是回调中的代码。对于您在回调中的情况,您要添加方法 sendToServer()的实现,而您无法做到这一点。

Basically () is the no arguments of the callback and { //... } is the code inside the callback. In your case inside the callback, you are adding an implemenation of the method sendToServer() and you cant do that..

sendToServer()是一个实例方法,它应位于 sendMessage() setState

sendToServer() is an instance method and it should be outside sendMessage() or setState:

  void sendMessage() {
    var PhoneNumber;
    String Name;
    String Emailid;
    Email email;
    setState(() {
      Emailid = emailController.text;
      Name = nameController.text;
      PhoneNumber = numberController.text;
      String messageBody = '$Name \n $PhoneNumber \n $Emailid';
      if (Name.isNotEmpty && Emailid.isNotEmpty && PhoneNumber.isNotEmpty) {
        email = Email(
          body: messageBody,
          subject: 'Email subject',
          recipients: ['onlineproductsking1@gmail.com'],
        );
        send(email);
      }
    });
    debugPrint('name -> $Name, number -> $PhoneNumber, emailid -> $Emailid');
  }

        sendToServer() {
          if (_emailFormKey.currentState.validate()) {
            //No error in validator
            _emailFormKey.currentState.save();
            Firestore.instance.runTransaction((Transaction transaction) async {
              CollectionReference reference =
                  Firestore.instance.collection('contact');

              await reference.add({
                "Name": "$Name",
                "Phone Number": "$PhoneNumber",
                "Email Id": "$Emailid"
              });
            });
          }
        }

关于其他错误,在您的 pubspec中。 yaml 文件添加以下依赖项:

Regarding the other errors, in your pubspec.yaml file add the following dependency:

  cloud_firestore: ^0.13.7

这篇关于无法从Firebase中的文本字段表单保存数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆