Flutter:如何在 phone 的屏幕上显示来自资产的短文本文件?
Flutter: How to display a short text file from assets on screen of phone?
关于Flutter读写文件的答案我都看完了。 None 其中回答了如何在 phone 的屏幕上显示文本文件的问题。
我想要做的就是让一个 function/method 以文件名作为输入进行调用,这将在 phone 的新屏幕上显示我的资产目录中的一个短文本文件我已经导航到。该文件正确放置在资产中并在 yaml 文件中提及。我看到了使用的建议:
Future loadAsset() async {
return await rootBundle.loadString('assets/my_text.txt');
}
但我不知道如何使用它以及使用什么代码在屏幕上显示文件。
我想你知道如何在屏幕上显示文本,所以我将尝试解释一下我通常如何阅读文件。
首先你必须导入:
import 'package:path_provider/path_provider.dart';
import 'dart:io';
然后,在您的 class 中,您可以使用:
Future<void> readMyFile() async {
Directory directory = await getApplicationDocumentsDirectory();
var _localFilePath = (directory.path + "yourfile.txt");
if (FileSystemEntity.typeSync(_localFilePath) == FileSystemEntityType.file) {
final myFile = await _localFile(_localFilePath);
List<String> linesAsList = await myFile.readAsLinesSync();
for (var i = 0; i < linesAsList.length; i++) {
//print("Line No: " + i.toString() + "\n");
print(linesAsList[i]);
}
}
}
Future<File> _localFile(String myPath) async {
return File(myPath);
}
最后,您的文件内容作为行列表在 linesAsList 中。
首先这个代码有一个新的屏幕并调用你的代码:
child:
FlatButton(
onPressed: () {
Navigator.pushNamed(context, '/indled');
setState(() {
ReadFile(fileName: 'myfile.txt');
print('Button 1 got pressed');
});
},
......
它打印 Button 1 got pressed on console 并且可以正常进入新屏幕 indled,其代码为:
class Indled extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Indledning'),
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Expanded(
child: Container(
padding: EdgeInsets.all(8.0),
child: Text('Indledning 2'),
它在屏幕上打印 'Indledning 2' 作为测试,但没有其他反应。我在单独的文件中有如下代码:
class ReadFile {
ReadFile({this.fileName});
final String fileName;
Future<void> readMyFile() async {
Directory directory = await getApplicationDocumentsDirectory();
var _localFilePath = (directory.path + "myfile.txt");
if (FileSystemEntity.typeSync(_localFilePath) ==
FileSystemEntityType.file) {
final myFile = await _localFile(_localFilePath);
List<String> linesAsList = myFile.readAsLinesSync();
for (var i = 0; i < linesAsList.length; i++) {
//print("Line No: " + i.toString() + "\n");
print(linesAsList[i]);
}
}
}
Future<File> _localFile(String myPath) async {
return File(myPath);
}
}
上线:List linesAsList = await myFile.readAsLinesSync();
我在等待时收到警告:仅等待期货
所以我拿出了等待。但如果包含 await,结果相同。
我尝试在您的代码中使用 fileName 而不是 "my file.txt",但结果相同。
您不需要将 Esen Mehmet 的代码添加到新文件中。假设您按下一个按钮,在新页面上打开文本文件,您只需要在相同的 class :
中添加以下代码
Future _future;
Future<String> loadString() async =>
await rootBundle.loadString('assets/text.txt');
@override
void initState() {
_future = loadString();
super.initState();
脚手架正文中的以下代码:
FutureBuilder(
future: _future,
builder: (context, snapshot) =>
Text(snapshot.hasData ? '${snapshot.data}' : ' Reading...')),
关于Flutter读写文件的答案我都看完了。 None 其中回答了如何在 phone 的屏幕上显示文本文件的问题。
我想要做的就是让一个 function/method 以文件名作为输入进行调用,这将在 phone 的新屏幕上显示我的资产目录中的一个短文本文件我已经导航到。该文件正确放置在资产中并在 yaml 文件中提及。我看到了使用的建议:
Future loadAsset() async {
return await rootBundle.loadString('assets/my_text.txt');
}
但我不知道如何使用它以及使用什么代码在屏幕上显示文件。
我想你知道如何在屏幕上显示文本,所以我将尝试解释一下我通常如何阅读文件。
首先你必须导入:
import 'package:path_provider/path_provider.dart';
import 'dart:io';
然后,在您的 class 中,您可以使用:
Future<void> readMyFile() async {
Directory directory = await getApplicationDocumentsDirectory();
var _localFilePath = (directory.path + "yourfile.txt");
if (FileSystemEntity.typeSync(_localFilePath) == FileSystemEntityType.file) {
final myFile = await _localFile(_localFilePath);
List<String> linesAsList = await myFile.readAsLinesSync();
for (var i = 0; i < linesAsList.length; i++) {
//print("Line No: " + i.toString() + "\n");
print(linesAsList[i]);
}
}
}
Future<File> _localFile(String myPath) async {
return File(myPath);
}
最后,您的文件内容作为行列表在 linesAsList 中。
首先这个代码有一个新的屏幕并调用你的代码:
child:
FlatButton(
onPressed: () {
Navigator.pushNamed(context, '/indled');
setState(() {
ReadFile(fileName: 'myfile.txt');
print('Button 1 got pressed');
});
},
......
它打印 Button 1 got pressed on console 并且可以正常进入新屏幕 indled,其代码为:
class Indled extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Indledning'),
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Expanded(
child: Container(
padding: EdgeInsets.all(8.0),
child: Text('Indledning 2'),
它在屏幕上打印 'Indledning 2' 作为测试,但没有其他反应。我在单独的文件中有如下代码:
class ReadFile {
ReadFile({this.fileName});
final String fileName;
Future<void> readMyFile() async {
Directory directory = await getApplicationDocumentsDirectory();
var _localFilePath = (directory.path + "myfile.txt");
if (FileSystemEntity.typeSync(_localFilePath) ==
FileSystemEntityType.file) {
final myFile = await _localFile(_localFilePath);
List<String> linesAsList = myFile.readAsLinesSync();
for (var i = 0; i < linesAsList.length; i++) {
//print("Line No: " + i.toString() + "\n");
print(linesAsList[i]);
}
}
}
Future<File> _localFile(String myPath) async {
return File(myPath);
}
}
上线:List linesAsList = await myFile.readAsLinesSync(); 我在等待时收到警告:仅等待期货 所以我拿出了等待。但如果包含 await,结果相同。
我尝试在您的代码中使用 fileName 而不是 "my file.txt",但结果相同。
您不需要将 Esen Mehmet 的代码添加到新文件中。假设您按下一个按钮,在新页面上打开文本文件,您只需要在相同的 class :
中添加以下代码Future _future;
Future<String> loadString() async =>
await rootBundle.loadString('assets/text.txt');
@override
void initState() {
_future = loadString();
super.initState();
脚手架正文中的以下代码:
FutureBuilder(
future: _future,
builder: (context, snapshot) =>
Text(snapshot.hasData ? '${snapshot.data}' : ' Reading...')),