Flutter 将字符串写入文本文件时出错
我一直在尝试通过按按钮将字符串记录到flifter中的文本文件中。这是我的密码:Flutter 将字符串写入文本文件时出错,flutter,dart,Flutter,Dart,我一直在尝试通过按按钮将字符串记录到flifter中的文本文件中。这是我的密码: onPressed: () async { File('dates.txt').writeAsStringSync('${_date.month}/${_date.day}/${_date.year}'); }), 我不知道为什么它不起作用,我想我错过了一些东西。 谢谢你的时间 我找到了这个问题的解决办法。总而言之,我查看
onPressed: () async {
File('dates.txt').writeAsStringSync('${_date.month}/${_date.day}/${_date.year}');
}),
我不知道为什么它不起作用,我想我错过了一些东西。
谢谢你的时间 我找到了这个问题的解决办法。总而言之,我查看了Flutter文档中的一页() 发现我只需要添加一些文件读/写所需的未来,并将它们应用到我的“onPressed”函数中 这是我的最终代码:
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
void main() => runApp(MaterialApp(
home: FirstScreen(),
));
class FirstScreen extends StatelessWidget {
@override
Widget build(BuildContext ctxt) {
return new Scaffold(
appBar: new AppBar(
centerTitle: true,
title: new Text("My School Calendar"),
),
body: Container(
child: Align(
alignment: Alignment(0, -0.9),
child: FlatButton.icon(
color: Colors.teal,
icon: Icon(Icons.plus_one), //`Icon` to display
label: Text('Create new entry'), //`Text` to display
onPressed: () {
Navigator.push(
ctxt,
new MaterialPageRoute(builder: (ctxt) => new SecondScreen()),
);
},
),
)),
);
}
}
class SecondScreen extends StatefulWidget {
@override
_SecondScreenState createState() => _SecondScreenState();
}
class _SecondScreenState extends State<SecondScreen> {
DateTime _date = new DateTime.now();
TimeOfDay _time = new TimeOfDay.now();
Future<Null> _selectDate(BuildContext ctxt) async {
final DateTime picked = await showDatePicker(
context: ctxt,
initialDate: _date,
firstDate: new DateTime.now().subtract(Duration(days: 1)),
lastDate: new DateTime.now().add(Duration(days: 365)),
);
if (picked != null && picked != _date) {
print('Date selected: ${_date.toString()}');
setState((){
_date = picked;
});
}
}
Future<Null> _selectTime(BuildContext ctxt) async {
final TimeOfDay picked = await showTimePicker(
context: ctxt,
initialTime: _time
);
if (picked != null && picked != _time) {
print('Date selected: ${_time.toString()}');
setState((){
_time = picked;
});
}
}
Future<File> get _localFile async {
final path = await _localPath;
return File('$path/date.txt');
}
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
Future<int> readDate() async {
try {
final file = await _localFile;
// Read the file
String contents = await file.readAsString();
print('Date read from file: ' + contents);
} catch (e) {
// If encountering an error, return 0
return 0;
}
}
Future<File> writeDate() async {
final file = await _localFile;
// Write the file.
String dateToWrite = '${_date.month}/${_date.day}/${_date.year}';
return file.writeAsString(dateToWrite);
}
final myController = TextEditingController();
@override
Widget build(BuildContext ctxt) {
return MaterialApp(
home: Scaffold(
appBar: new AppBar(
title: new Text("Enter assignment details"),
),
body: Container(
margin: const EdgeInsets.only(top: 10.0),
child: Align(
alignment: Alignment(0, -0.9),
child: Column(children: <Widget>[
TextField(
controller: myController,
textAlign: TextAlign.center,
decoration: InputDecoration(
border: OutlineInputBorder(
borderSide: BorderSide(
color: Colors.black,
),
borderRadius: BorderRadius.all(Radius.circular(15)),
),
hintText: 'Enter assignment name'),
),
FlatButton.icon(
color: Colors.redAccent,
icon: Icon(Icons.calendar_today), //`Icon` to display
label: Text('Select date'), //`Text` to display
onPressed: () {
_selectDate(ctxt);
}),
Text('Date selected: ${_date.month}/${_date.day}/${_date.year}'),
FlatButton.icon(
color: Colors.grey,
icon: Icon(Icons.access_time), //`Icon` to display
label: Text('Select time'), //`Text` to display
onPressed: () {
_selectTime(ctxt);
}),
Text('Time selected: ${_time.hour}:${_time.minute}'),
FlatButton.icon(
color: Colors.lightBlueAccent,
icon: Icon(Icons.check_box), //`Icon` to display
label: Text('Submit'), //`Text` to display
onPressed: () {
writeDate();
readDate();
}),
]),
),
)));
}
}
导入“包装:颤振/材料.省道”;
导入“dart:async”;
导入“dart:io”;
导入“package:path_provider/path_provider.dart”;
void main()=>runApp(MaterialApp(
主页:FirstScreen(),
));
类FirstScreen扩展了无状态小部件{
@凌驾
小部件构建(BuildContext-ctxt){
归还新脚手架(
appBar:新的appBar(
标题:对,
标题:新文本(“我的学校日历”),
),
主体:容器(
子对象:对齐(
对齐:对齐(0,-0.9),
子:FlatButton.icon(
颜色:Colors.teal,
图标:图标(Icons.plus_one),/`icon`显示
标签:文本(“创建新条目”),//`Text`显示
已按下:(){
导航器。推(
ctxt,
new MaterialPage路由(生成器:(ctxt)=>new SecondScreen()),
);
},
),
)),
);
}
}
类SecondScreen扩展StatefulWidget{
@凌驾
_SecondScreenState createState()=>\u SecondScreenState();
}
类_SecondScreenState扩展状态{
DateTime _date=new DateTime.now();
TimeOfDay _time=新的TimeOfDay.now();
Future\u selectDate(BuildContext ctxt)异步{
选择的最终日期时间=等待showDatePicker(
上下文:ctxt,
初始日期:_日期,
firstDate:new DateTime.now().subtract(持续时间(天:1)),
lastDate:new DateTime.now().add(持续时间:365天)),
);
如果(已拾取!=null&&picked!=\u日期){
打印('所选日期:${u Date.toString()}');
设置状态(){
_日期=已拾取;
});
}
}
Future\u selectTime(BuildContext-ctxt)异步{
最终拾取的日期时间=等待显示时间选择器(
上下文:ctxt,
初始时间:\u时间
);
如果(已拾取!=null&&picked!=\u时间){
打印('所选日期:${u time.toString()}');
设置状态(){
_时间=已拾取;
});
}
}
未来获取\u本地文件异步{
最终路径=等待_localPath;
返回文件(“$path/date.txt”);
}
未来获取\u本地路径异步{
最终目录=等待getApplicationDocumentsDirectory();
返回directory.path;
}
Future readDate()异步{
试一试{
final file=wait\u localFile;
//读文件
String contents=wait file.readAsString();
打印('从文件读取的日期:'+内容);
}捕获(e){
//如果遇到错误,则返回0
返回0;
}
}
Future writeDate()异步{
final file=wait\u localFile;
//写这个文件。
字符串dateToWrite='${{date.month}/${{date.day}/${{date.year}';
返回文件.writeAsString(dateToWrite);
}
最终myController=TextEditingController();
@凌驾
小部件构建(BuildContext-ctxt){
返回材料PP(
家:脚手架(
appBar:新的appBar(
标题:新文本(“输入分配详细信息”),
),
主体:容器(
边距:仅限常量边集(顶部:10.0),
子对象:对齐(
对齐:对齐(0,-0.9),
子项:列(子项:[
文本字段(
控制器:myController,
textAlign:textAlign.center,
装饰:输入装饰(
边框:大纲输入边框(
边界边(
颜色:颜色,黑色,
),
borderRadius:borderRadius.all(半径.圆形(15)),
),
hintText:“输入分配名称”),
),
FlatButton.icon(
颜色:Colors.redAccent,
图标:图标(Icons.calendar_today),//`icon`显示
标签:文本('Select date'),//`Text`显示
已按下:(){
_选择日期(ctxt);
}),
文本('所选日期:${u Date.month}/${{u Date.day}/${{u Date.year}'),
FlatButton.icon(
颜色:颜色。灰色,
图标:图标(Icons.access_time),/`icon`显示
标签:文本(“选择时间”),//`Text`显示
已按下:(){
_选择时间(ctxt);
}),
文本('所选时间:${{u Time.hour}:${{u Time.minute}'),
FlatButton.icon(
颜色:Colors.lightBlueAccent,
图标:要显示的图标(图标。复选框),/`icon`
标签:文本('Submit'),/`Text`显示
已按下:(){
writeDate();
readDate();
}),
]),
),
)));
}
}
希望这对其他人有帮助 你有错误吗?请将他们包括在问题中。你在哪里执行??请提供更多信息。我想如果你在浏览器中运行这个,你的上下文中没有dates.txt。我没有收到任何错误,我是从Android Studio SDK运行的。定义“不工作”。另外,当您使用
writeastringsync
同步写入文件时,async
是多余的。它没有写入文本文件,当我按下按钮时,文本文件为空。