【问题标题】:Flutter: How to display a short text file from assets on screen of phone?Flutter:如何在手机屏幕上显示来自资产的短文本文件?
【发布时间】:2019-05-17 14:04:17
【问题描述】:

我已经检查了所有关于在 Flutter 中读写文件的答案。他们都没有回答如何在手机屏幕上显示文本文件的问题。

我想要做的就是有一个函数/方法以文件名作为输入进行调用,这将在我导航到的手机的新屏幕上显示我的资产目录中的一个短文本文件。该文件正确放置在资产中并在 yaml 文件中提及。我已经看到了使用建议:

Future loadAsset() async {
return await rootBundle.loadString('assets/my_text.txt');
}

但我不知道如何使用它以及使用什么代码在屏幕上显示文件。

【问题讨论】:

    标签: flutter text-files display


    【解决方案1】:

    您无需将 Esen Mehmet 的代码添加到新文件中。假设您正在按下一个在新页面上打开文本文件的按钮,您只需在同一类中添加以下代码:

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

    【讨论】:

    • 是的,这正是我所做的:将该代码添加到每个小文本文件中,它工作正常。
    【解决方案2】:

    我想您知道如何在屏幕上显示文本,所以我将尝试解释一下我通常是如何读取文件的。

    首先你必须导入:

    import 'package:path_provider/path_provider.dart';
    import 'dart:io';
    

    然后,在你的课堂上,你可以使用这个:

    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 中作为行列表。

    【讨论】:

    • Celt K.B.:你能告诉我上面的代码有什么问题吗?
    • 在您的代码中,您永远不会调用函数 readMyFile()。我想,你应该有类似的东西: ReadFile yourReader = ReadFile(fileName: 'myfile.txt'); yourReader.readMyFile();
    • 这有帮助。它现在调用 readMyFile。我可以看到,因为我在控制台中添加了一个打印语句。但它不会在屏幕上显示 myfile.txt。那怎么办?
    • 在 readMyFile 我还尝试将“myfile.txt”更改为文件名(不带引号。这样做不正确吗?我需要它来打印更多小文件。顺便说一句,它不应该有在你的代码中 myfile.txt 被单引号引起来吗?
    • 上线:List linesAsList = await myFile.readAsLinesSync();我仍然收到关于 await 的警告:Await only futures 所以我拿出了 await。
    【解决方案3】:

    首先此代码有一个新屏幕并调用您的代码:

    child: 
    FlatButton(
      onPressed: () {
        Navigator.pushNamed(context, '/indled');
        setState(() {
          ReadFile(fileName: 'myfile.txt');
          print('Button 1 got pressed');
        });
        },
        ......
    

    它打印按钮 1 在控制台上被按下并进入新屏幕,其中包含代码:

    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”,但结果相同。

    【讨论】:

    • 我现在需要在 ListView 中显示我的小文本文件。该文件仍在应用程序的资产目录中,我想使用 rootbundle.loadstring 命令。任何人都可以帮助如何做到这一点?
    猜你喜欢
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多