如何从Facebook API获取将数据导入CSV并使用Flutter导出CSV文件 [英] How to import data to CSV getting from facebook API and export the CSV file using flutter

查看:46
本文介绍了如何从Facebook API获取将数据导入CSV并使用Flutter导出CSV文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有下面的简单代码,这些代码通过Facebook API进行用户身份验证并读取默认用户信息.

I have the below Simple code that make user authentication via Facebook API and read the default user information.

这是我的代码段:

import 'package:flutter/material.dart';
import 'package:flutter_facebook_login/flutter_facebook_login.dart';
import 'package:http/http.dart' as http;
import 'dart:convert' as JSON;

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

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

class _MyAppState extends State<MyApp> {
  bool _isLoggedIn = false;
  Map userProfile;
  final facebookLogin = FacebookLogin();

  _loginWithFB() async {
    final result = await facebookLogin.logIn(['email']);

    switch (result.status) {
      case FacebookLoginStatus.loggedIn:
        final token = result.accessToken.token;
        final graphResponse = await http.get(Uri.parse(
            'https://graph.facebook.com/v10.0/me?fields=id,name,picture,email,name_format,birthday,hometown&access_token=${token}'));

        final profile = JSON.jsonDecode(graphResponse.body);
        print(profile);
        setState(() {
          userProfile = profile;
          _isLoggedIn = true;
        });
        break;

      case FacebookLoginStatus.cancelledByUser:
        setState(() => _isLoggedIn = false);
        break;
      case FacebookLoginStatus.error:
        setState(() => _isLoggedIn = false);
        break;
    }
  }

  _logout() {
    facebookLogin.logOut();
    setState(() {
      _isLoggedIn = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
      home: Scaffold(
        body: Center(
            child: _isLoggedIn
                ? Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Image.network(
                  userProfile["picture"]["data"]["url"],
                  height: 100.0,
                  width: 100.0,
                ),
                Text(userProfile["id"]),
                Text(userProfile["name"]),
                Text(userProfile["email"]),
                Text(userProfile["name_format"]),
                Text(userProfile["birthday"] ?? 'Birthday: empty'),
                Text(userProfile["hometown"] ?? 'Hometown: empty'),
                OutlinedButton(
                  child: Text("Logout"),
                  onPressed: () {
                    _logout();
                  },
                )
              ],
            )
                : Center(
              child: OutlinedButton(
                child: Text("Login with Facebook"),
                onPressed: () {
                  _loginWithFB();
                },
              ),
            )),
      ),
    );
  }
}

因为我需要导出CSV文件,如下图所示:

as I need to export a CSV file to be something like the below image:

推荐答案

使用 CSV插件.

csv: ^5.0.0

步骤2:创建CsvController.dart文件,并为CsvController添加以下代码

class CsvController {

  static Future<File> getCsvFromList(List<List<dynamic>> csvDataList) async {
    try {
      String csvDataString = const ListToCsvConverter().convert(csvDataList);
      File csvFile = await _saveFile(csvDataString);
      return csvFile;
    } catch (e) {
      print(e.toString());
      return null;
    }
  }

  static Future<File> getCsvFromString(String csvString) async {
    try {
      File csvFile = await _saveFile(csvString);
      return csvFile;
    } catch (e) {
      print(e.toString());
      return null;
    }
  }

  static Future<String> _getFilePath(String fileName) async {
    Directory appDocumentsDirectory = await getExternalStorageDirectory(); // 1
    String appDocumentsPath = appDocumentsDirectory.path; // 2
    String filePath = '$appDocumentsPath/$fileName.csv'; // 3
    return filePath;
  }

  static Future<File> _saveFile(String fileDataString, {index = 0}) async {
    try {
      File file = File(await _getFilePath(
          "${General.getDate().millisecondsSinceEpoch}" +
              (index > 0 ? "($index)" : "")));
      if (!file.existsSync()) {
        // 1
        file.writeAsStringSync(fileDataString); // 2
        return file;
      } else {
        return _saveFile(fileDataString, index: index + 1);
      }
    } catch (e) {
      print(e.toString());
      return null;
    }
  }
}

第3步:只需根据您的数据调用相应的函数,如下所示:

//if you have comma separated string already 
File csvFile = await CsvController.getCsvFromString(your_comma_separated_String);
if(csvFile != null){
    print("File created here :"+csvFile.path);
}else{
    print("file not created");
}

//if you have data in List<List<dynamic>> format or you can convert to this format

//for Example, To create a csv file like this
     // 1,2,3
     // "A","B","C"
     // 7,8,9

//in Your case 
List<List<dynamic>> csvData= [
["ID","username","email"],
[123,"user 1","user1@email.com"]
]

// create a list and just send it like below:
List<List<dynamic>> csvData=[
[1,2,3],
["A","B","C"],
[7,8,9]
];

File csvFile = await CsvController.getCsvFromList(csvData);
if(csvFile != null){
    print("File created here :"+csvFile.path);
}else{
    print("file not created");
}

注意:此类还处理存在的文件,然后将其添加到名称中,并像在浏览器中下载文件一样创建它.

NOTE: This class also takes care of the file that exists then it will just add the number to its name and will create it like file downloading in the browser.

例如,

File.csv存在,它将创建File(1).csv

File.csv exists then it will create File(1).csv

这篇关于如何从Facebook API获取将数据导入CSV并使用Flutter导出CSV文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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