无法从 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 字符串对象