【问题标题】:how to convert csv data from filepicker to dynamic list?如何将 csv 数据从文件选择器转换为动态列表?
【发布时间】:2021-07-09 08:47:08
【问题描述】:

我创建了用户可以加载 csv 文件的应用程序,并且我希望将 csv 数据放入地图中,以便我可以制作删除功能或其他任何东西....有人可以帮助我,因为我一直在寻找它,它显示了如何转换 csv使用 loadasset 包,我想从手机存储中挑选文件

示例:convert data from a csv to a dynamic List (Flutter)

I/flutter ( 4028): [[No,  Name,  Code], [1,  Ali,  A123], [2,  Abu,  B456], [3,  Amir,  C789], [4,  Safe,  D098], [5,  Alif,  E765 ]]

这是我的代码

Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("CSV DATA"),
          backgroundColor: Colors.redAccent[400],
        ),
        body: Container(
            child: SingleChildScrollView(
          child: Column(children: <Widget>[
            FutureBuilder(
              future: loadingCsvData(path),
              builder: (context, AsyncSnapshot<List<dynamic>> snapshot) {
                print(snapshot.data.toString());
                return snapshot.hasData
                    ? ListView(
                        scrollDirection: Axis.vertical,
                        shrinkWrap: true,
                        children: snapshot.data.map((data) {
                          return Visibility(
                              visible: visibilityController,
                              child: //Your card
                                  Card(
                                child: GestureDetector(
                                  onTap: () {
                                    withInputField(context);
                                    controller.text = data[1];
                                    _controller.text = data[2];
                                    setState(() {});
                                  },
                                  child: ListTile(
                                    title: Text(
                                      data[1].toString(),
                                      style: TextStyle(
                                          fontWeight: FontWeight.bold),
                                    ),
                                    subtitle: Text(data[2].toString()),
                                    isThreeLine: true,
                                    trailing: IconButton(
                                      icon: Icon(Icons.delete),
                                      onPressed: () {},
                                    ),
                                  ),
                                ),
                              ));
                        }).toList(),
                      )
                    : Center(
                        child: CircularProgressIndicator(),
                      );
              },
            ),
          ]),
        )),

这是我的文件选择器功能

Future<List<List<dynamic>>> loadingCsvData(String path) async {
    final csvFile = new File(path).openRead();
    return await csvFile
        .transform(utf8.decoder)
        .transform(
          CsvToListConverter(),
        )
        .toList();
  }

编辑

我的获取数据

FutureBuilder(
              future: loadingCsvData(path),
              builder: (context,
                  AsyncSnapshot<Map<int, Map<String, dynamic>>> snapshot) {
                print(snapshot.data.toString());
                return snapshot.hasData
                    ? ListView(
                        scrollDirection: Axis.vertical,
                        shrinkWrap: true,
                        children: [
                          Card(
                            child: ListTile(
                              title: Text(userList.toString()),
                            ),
                          )
                        ],
                      )
                    : Center(
                        child: CircularProgressIndicator(),
                      );
              },
            ),

这样做对吗

【问题讨论】:

    标签: flutter csv dart


    【解决方案1】:

    我会为您要读取的对象创建一个模型。

    在模型中,我会准备一些函数来转换 Map&lt;String, dynamic&gt; 中的单个行并转换 Map&lt;int, Map&lt;String, dynamic&gt;&gt; 中的行列表。

    这是一个例子:

    //I suppose your single row element to be an User
    class User {
      
      User({
        No,
        Name,
        Code,
      }) {
        this.No = No;
        this.Name = Name;
        this.Code = Code;
      }
    
      //Parameters
      int? No;
      String? Name;
      String? Code;
    
      // A map with an String key and dynamic value
      static Map<String, dynamic> userToMap(List<dynamic> row) {
        return {
          if (row[0] != null) 'No': row[0] as int,
          if (row[1] != null) 'Name': row[1] as String,
          if (row[2] != null) 'Code': row[2] as String
        };
      }
    
      // A map with an int key and Map<String, dynamic> value
      static Map<int, Map<String, dynamic>> userListToMap(
          List<List<dynamic>> userList) {
        userList.removeAt(0); //If you want to remove the first row containing the headers
        return userList.map((user) => userToMap(user)).toList().asMap();
      }
    }
    

    然后您可以获取从您的方法 loadingCsvData 返回的 List&lt;List&lt;dynamic&gt;&gt; 并调用 userListToMap

    更新: 写完我的答案后,我注意到您实际上并不需要我构建的类,您可以单独使用 userToMapuserListToMap 函数,它应该可以工作。

    编辑:

    您可以将您的 loadingCsvData 更改为如下所示:

      Future<Map<int, Map<String, dynamic>>> loadingCsvData(String path) async {
        final csvFile = new File(path).openRead();
        return userListToMap(await csvFile
            .transform(utf8.decoder)
            .transform(
          CsvToListConverter(),
        ).toList());
      }
    

    【讨论】:

    • 我如何调用方法 userListToMap 的 loadingCsvData... 你能告诉我怎么做吗?
    • 但是对于我未来的构建器来说,我遇到了这样的错误,我该如何解决这个问题.....“参数类型 'Widget Function(BuildContext, AsyncSnapshot>)' 不能是分配给参数类型 'Widget Function(BuildContext, AsyncSnapshot>>)'.",
    • 随着future函数的改变,builder正在接收新类型的快照,你需要改变它。之前是 List,但现在是 Map>。 builder: (context, AsyncSnapshot>> 快照)
    • 我无法在列表视图中获取数据它变成空白你能帮我吗....你的帮助真的很感激先生
    • 对不起,我不能帮助你更多,你的问题是关于将数据转换成地图,但现在你问的越来越多了。我建议您在开始编写代码之前先学习一些教程。看看 Andrea Bizzotto 的这篇博客,对我学习 Flutter 很有帮助。 codewithandrea.com
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2021-11-15
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多