我创建的应用程序用户可以加载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
。
更新:在写下我的答案后,我注意到你实际上并不需要我构建的类,你可以单独使用函数userToMap
和userListToMap
,它应该可以工作。
编辑:
你可以把你的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());
}