如何将csv数据从filepicker转换为动态列表



我创建的应用程序用户可以加载csv文件,我希望csv数据放入地图中,这样我就可以执行删除功能或其他任何功能。。。。有人能帮我吗?因为我一直在搜索它,它展示了如何使用loadasset捆绑包转换csv。我想用手机存储中的pick文件来做这件事

示例:将数据从csv转换为动态列表(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(),
);
},
),

这样做正确吗

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

在模型中,我会准备一些函数来转换Map<String, dynamic>中的单个Row和Map<int, Map<String, dynamic>>中的List of Rows。

这里有一个例子:

//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<List<dynamic>>并调用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());
}

相关内容

  • 没有找到相关文章

最新更新