クラスのアイテムをListViewに一覧表示するこの画面があります。私が欲しいのは、そのリストをCSVファイルにエクスポートするボタン(コード内のFloatingActionButton)を用意することです。私はそれが見えるべきだと思うコードを持っていますが、私の問題は、エクスポートするためにボタンでonPressedを使用する方法がわからないことです、今のところそれはnullですが、getCSV()関数を呼び出す必要がありますその中の何か。コードは次のとおりです。
class MailListAdmin extends StatefulWidget {
@override
_MailListAdminState createState() => _MailListAdminState();
}
class _MailListAdminState extends State<MailListAdmin> {
List<String> list = [];
List<Email> finalExport;
@override
void initState() {
super.initState();
DatabaseProvider.db.getMail().then(
(mailList) {
BlocProvider.of<MailBloc>(context).add(SetMail(mailList));
},
);
}
getCsv(List<Email> mailList) async {
List<List<dynamic>> rows = List<List<dynamic>>();
for (int i = 0; i < mailList.length; i++) {
List<dynamic> row = List();
row.add(mailList[i].id);
row.add(mailList[i].email);
rows.add(row);
setState(() {
mailList = finalExport;
});
print(rows);
}
await SimplePermissions.requestPermission(Permission.WriteExternalStorage);
bool checkPermission = await SimplePermissions.checkPermission(
Permission.WriteExternalStorage);
if (checkPermission) {
String dir =
(await getExternalStorageDirectory()).absolute.path + "/documents";
String file = "$dir";
File f = new File(file + "filename.csv");
String csv = const ListToCsvConverter().convert(rows);
f.writeAsString(csv);
}
}
//-------------------------------------
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.blueGrey[900],
title: Text('Newsletter Users'),
actions: [
Padding(
padding: EdgeInsets.only(right: 20.0),
child: Badge(
child: Text('Copied ' + list.length.toString()),
showBadge: false)),
],
),
body: Container(
child: BlocConsumer<MailBloc, List<Email>>(
builder: (context, mailList) {
return ListView.separated(
itemCount: mailList.length,
itemBuilder: (BuildContext context, int index) {
Email mail = mailList[index];
return Card(
child: ListTile(
leading: GestureDetector(
child: Icon(Icons.copy),
onTap: () {
FlutterClipboard.copy(mail.email);
print('Copied ${mail.email}!');
Scaffold.of(context).showSnackBar(SnackBar(
backgroundColor: Colors.grey[600],
duration: Duration(milliseconds: 1000),
content: Text(
'${mail.email} Copied To Clipboard!',
style: TextStyle(fontSize: 20.0),
),
));
list.add(mail.email);
setState(() {
list.length.toString();
});
print(mail.email);
print(list);
}),
trailing: Icon(Icons.delete),
onTap: () {
DatabaseProvider.db.deleteMail(mail.id).then((_) {
BlocProvider.of<MailBloc>(context).add(
DeleteMail(index),
);
});
list.remove(mail.email);
print(list);
setState(() {
list.length.toString();
});
},
title: Text(
mail.email,
style: TextStyle(fontSize: 20.0),
),
),
);
},
separatorBuilder: (BuildContext context, int index) =>
Divider(color: Colors.black),
);
},
listener: (BuildContext context, mailList) {},
),
),
floatingActionButton: FloatingActionButton(
child: Text('Export'),
onPressed: () =>
null, //im not sure how to add the mailList to getCsv(???)
),
);
}
}
getCSV関数でアクティブ化する方法がわからないエクスポートボタンを確認してください。また、保存したCSVファイルにアクセスするにはどうすればよいですか(デバイスのどこに保存されますか?)
次の手順を試してください。
BlocConsumer
ます。onPressed
をgetCsv
メソッドに渡して使用します。theEmails
新しいリストです。
class _MailListAdminState extends State<MailListAdmin> {
List<String> list = [];
List<Email> finalExport;
@override
void initState() {
super.initState();
DatabaseProvider.db.getMail().then(
(mailList) {
BlocProvider.of<MailBloc>(context).add(SetMail(mailList));
},
);
}
List<Email> theEmails = [];
getCsv(List<Email> mailList) async {
List<List<dynamic>> rows = List<List<dynamic>>();
for (int i = 0; i < mailList.length; i++) {
List<dynamic> row = List();
row.add(mailList[i].id);
row.add(mailList[i].email);
rows.add(row);
setState(() {
mailList = finalExport;
});
print(rows);
}
await SimplePermissions.requestPermission(Permission.WriteExternalStorage);
bool checkPermission = await SimplePermissions.checkPermission(
Permission.WriteExternalStorage);
if (checkPermission) {
String dir =
(await getExternalStorageDirectory()).absolute.path + "/documents";
String file = "$dir";
File f = new File(file + "filename.csv");
String csv = const ListToCsvConverter().convert(rows);
f.writeAsString(csv);
}
}
//-------------------------------------
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.blueGrey[900],
title: Text('Newsletter Users'),
actions: [
Padding(
padding: EdgeInsets.only(right: 20.0),
child: Badge(
child: Text('Copied ' + list.length.toString()),
showBadge: false)),
],
),
body: Container(
child: BlocConsumer<MailBloc, List<Email>>(
builder: (context, mailList) {
theEmails = mailList;
return ListView.separated(
itemCount: mailList.length,
itemBuilder: (BuildContext context, int index) {
Email mail = mailList[index];
return Card(
child: ListTile(
leading: GestureDetector(
child: Icon(Icons.copy),
onTap: () {
FlutterClipboard.copy(mail.email);
print('Copied ${mail.email}!');
Scaffold.of(context).showSnackBar(SnackBar(
backgroundColor: Colors.grey[600],
duration: Duration(milliseconds: 1000),
content: Text(
'${mail.email} Copied To Clipboard!',
style: TextStyle(fontSize: 20.0),
),
));
list.add(mail.email);
setState(() {
list.length.toString();
});
print(mail.email);
print(list);
}),
trailing: Icon(Icons.delete),
onTap: () {
DatabaseProvider.db.deleteMail(mail.id).then((_) {
BlocProvider.of<MailBloc>(context).add(
DeleteMail(index),
);
});
list.remove(mail.email);
print(list);
setState(() {
list.length.toString();
});
},
title: Text(
mail.email,
style: TextStyle(fontSize: 20.0),
),
),
);
},
separatorBuilder: (BuildContext context, int index) =>
Divider(color: Colors.black),
);
},
listener: (BuildContext context, mailList) {},
),
),
floatingActionButton: FloatingActionButton(
child: Text('Export'),
onPressed: (){
getCsv(theEmails);
}, //im not sure how to add the mailList to getCsv(???)
),
);
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加