无法从 firebase 中的文本字段表单中保存数据

Posted

技术标签:

【中文标题】无法从 firebase 中的文本字段表单中保存数据【英文标题】:Unable to save the data from the textfields forms in the firebase 【发布时间】:2020-11-16 01:12:12 【问题描述】:

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

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

我的代码:

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 毫秒内重新启动应用程序。

请帮我解决这个问题,并指出我哪里出错了。

【问题讨论】:

是的,它确实帮助了我。我只需要做出一些改变 【参考方案1】:

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

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

基本上:

setState(() 
                           
);

基本上() 是回调的无参数, //... 是回调内的代码。在您的回调中,您正在添加方法 sendToServer() 的实现,但您不能这样做..

sendToServer()是一个实例方法,它应该在sendMessage()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 文件中添加以下依赖项:

  cloud_firestore: ^0.13.7

【讨论】:

以上是关于无法从 firebase 中的文本字段表单中保存数据的主要内容,如果未能解决你的问题,请参考以下文章

Android:从运行时生成的文本字段中将数据保存到Firebase

无法从添加/删除文本字段中的文本字段值形成 JSON 字符串对象

点击保存按钮并存储在字典中时获取表格视图单元格中的文本字段?

限制表单输入文本字段中允许的字符数

asp.net 微信企业号办公系统-表单设计-文本框

从 Firebase 数据库中检索用户数据并显示在用户配置文件文本字段中