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

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

问题描述

我正在尝试发送电子邮件并将用户输入数据从 Flutter 应用程序保存到 Firebase.

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

我的代码是这样的:我已经创建了能够发送电子邮件的应用程序,但我一直无法将这些文本字段数据保存在 firebase 中.我已经在代码中实现了 Cloud Firestore,但出现了很多错误.

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 
 $PhoneNumber 
 $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(() {
                           
});

基本上 () 是回调的无参数,而 {//... } 是回调内的代码.在您的回调中,您正在添加方法 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 
 $PhoneNumber 
 $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天全站免登陆