问题是:我有一个包含一行文本的.txt文件,我需要将该行读入一个String变量。
我发现的大多数方法都返回Future或Future,我不知道如何将这些类型转换为字符串。另外,我不确定我在readAsStringSync上做错了什么因为我得到了一个“FileSystemExeption:无法打开文件(操作系统错误:没有这样的文件或目录)”,即使我在pubspec.yaml中引用了它
class LessonPage extends StatelessWidget { LessonPage({this.title, this.appBarColor, this.barTitleColor, this.fileName});
final String title;
final Color appBarColor;
final Color barTitleColor;
final String fileName;
@override
Widget build(BuildContext context) {
final file = new File(this.fileName);
return new Scaffold(
appBar: new AppBar(
title: new Text(
this.title,
style: new TextStyle(color: this.barTitleColor)
),
backgroundColor: this.appBarColor,
),
body: new Center(
child: new Text(
file.readAsStringSync(),
softWrap: true,
)
),
);
答案 0 :(得分:5)
拥抱Future
!这个用例正是FutureBuilder
的用途。
要将资源作为字符串读取,您不需要构建File
。而是使用DefaultAssetBundle
来访问资产文件。确保要在pubspec.yaml中声明要读取的资产文件。
return new Scaffold(
appBar: new AppBar(
title: new Text(
this.title,
style: new TextStyle(color: this.barTitleColor)
),
backgroundColor: this.appBarColor,
),
body: new Center(
child: new FutureBuilder(
future: DefaultAssetBundle.of(context).loadString(fileName),
builder: (context, snapshot) {
return new Text(snapshot.data ?? '', softWrap: true);
}
),
),
);
如果您正在阅读不属于资产的文件(例如,您下载到临时文件夹的文件),那么使用File
是合适的。在这种情况下,请确保路径正确。考虑使用FutureBuilder
而不是同步File
API,以获得更好的性能。