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...')),