微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Flutter中将Datatable Form Firestore创建为CSV文件

如何解决如何在Flutter中将Datatable Form Firestore创建为CSV文件

好的,这是故事:

我的应用程序可以创建报告,现在这些报告可以整齐地显示在表格中。数据正在从Firestore中流式传输。

问题:

一个必须具备的功能,能够将报告导出到应用程序之外,例如通过电子邮件发送报告。因此,我尝试将其导出为PDF,但是它只保存了当前在支架中查看的内容,这意味着需要滚动才能显示/看到的行和列不会导出到PDF。目前,我正在尝试执行相同操作,但要对包含从Firestore实例流式传输的所有数据的CSV文件进行格式化,并在数据表视图中对其进行格式化

**使用完整代码编辑** 这是代码

  import 'dart:io';

import 'package:basic_utils/basic_utils.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:csv/csv.dart';
import 'package:Flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:Flutter_email_sender/Flutter_email_sender.dart';

class AdminPage extends StatefulWidget {
  static final TextEditingController _emailController = TextEditingController();

  @override
  _AdminPageState createState() => _AdminPageState();
}

class _AdminPageState extends State<AdminPage> {
  final GlobalKey<FormState> _formkey = GlobalKey<FormState>();
  DocumentSnapshot _currentDocument;

  String filePath;
  String currentProcess;
  bool isProcessing = false;

  Future<String> get _localPath async {
    final directory = await getApplicationSupportDirectory();

    return directory.absolute.path;
  }

  Future<File> get _localFile async {
    final path = await _localPath;
    filePath = '$path/clouddata.csv';
    return File('$path/clouddata.csv').create();
  }



  List<List<dynamic>> rows = List<List<dynamic>>();
  getCsv(DocumentSnapshot document) async {
    setState(() {
      currentProcess = "Getting data from the cloud";
      isProcessing = true;
    });
    Firestore.instance
          .collection('Airline_Transactions').document(_currentDocument.documentID)
          .snapshots();
   {
      setState(() {
        currentProcess = "Decoding data";
      });
    }
    rows.add([
      "Date","Airline","Flight Number","Terminal","pax","Infant","Transit",]);
    if (document.data != null) {
      for (int i = 0; i < document.data.length; i++) {
        List<dynamic> row = List<dynamic>();
        row.add(document.data[i]["date"].toString());
        row.add(document.data[i]["airline"].toString());
        row.add(document.data[i]["flight_number"].toString());
        row.add(document.data[i]["terminal"].toString());
        row.add(document.data[i]["pax"].toString());
        row.add(document.data[i]["infant"].toString());
        row.add(document.data[i]["transit"].toString());
        rows.add(row);
      }


      File f = await _localFile.whenComplete(() {
        setState(() {
          currentProcess = "Writing to CSV";
        });
      });
      String csv = const ListToCsvConverter().convert(rows);
      f.writeAsstring(csv);
       filePath = f.uri.path;
    }
  }

  sendMailAndAttachment() async {
    final Email email = Email(
      body:
      'Data Collected and Compiled by the Datum App. <br> A CSV file is attached to this <b>mail</b> <hr><br> Compiled at ${DateTime.Now()}',subject: 'Datum Entry for ${DateTime.Now().toString()}',recipients: [AdminPage._emailController.text],isHTML: true,attachmentPath: filePath,);

    await FlutterEmailSender.send(email);
  }

  GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,appBar: AppBar(title: Text("Datum Dash")),body: ListView(
        padding: EdgeInsets.only(top: 45,right: 10,left: 10,bottom: 20),children: <Widget>[
          Text("Welcome to DashBoard",style: TextStyle(fontSize: 30,fontWeight: FontWeight.w500)),Form(
            key: _formkey,child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[
                Padding(
                  padding: const EdgeInsets.only(top: 20.0),child: TextFormField(
                    controller: AdminPage._emailController,validator: (str) => (str.length == 0)
                        ? "please enter your email"
                        : (!EmailUtils.isEmail(str))
                        ? "please enter a valid email"
                        : null,decoration: Inputdecoration(
                        labelText: "Enter your email",border: OutlineInputBorder(),suffixIcon: Icon(Icons.email)),),Padding(
                  padding: const EdgeInsets.only(top: 8.0),child: RaisedButton(
                    color: Theme.of(context).accentColor,child: Text("Compile and Send"),onpressed: (isProcessing)
                        ? null
                        : () async {
                      if (_formkey.currentState.validate()) {
                        try {
                          final result =
                          await InternetAddress.lookup('google.com');
                          if (result.isNotEmpty &&
                              result[0].rawAddress.isNotEmpty) {
                            await getCsv(_currentDocument).then((v) {
                              setState(() {
                                currentProcess =
                                "Compiling and sending mail";
                              });
                              sendMailAndAttachment().whenComplete(() {
                                setState(() {
                                  isProcessing = false;
                                });
                                _scaffoldKey.currentState
                                    .showSnackBar(SnackBar(
                                  content: Text("Data Sent"),));
                              });
                            });
                          }
                        } on SocketException catch (_) {
                          _scaffoldKey.currentState.showSnackBar(SnackBar(
                            content: Text(
                                "Connect your device to the internet,and try again"),));
                        }
                      }
                    },Padding(
                  padding: const EdgeInsets.all(8.0),child: Visibility(
                    visible: (isProcessing) ? true : false,child: Row(
                      children: <Widget>[
                        SizedBox(
                            child: CircularProgressIndicator(),height: 25,width: 25),Padding(
                          padding: const EdgeInsets.all(8.0),child: Text("$currentProcess"),)
                      ],],)
        ],);
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。