详解Flutter如何读写文本文件

 更新时间:2022年04月12日 08:55:15   作者:大前端之旅  
文本文件(具有 .txt扩展名)广泛用于持久存储信息,从数字数据到长文本。本文主要为大家介绍了2个使用此文件类型的Flutter应用程序示例,感兴趣的可以了解一下

介绍

文本文件(具有 .txt扩展名)广泛用于持久存储信息,从数字数据到长文本。今天,我将介绍 2 个使用此文件类型的 Flutter 应用程序示例。

第一个示例快速而简单。它仅使用 rootBundle(来自 services.dart)从 assets 文件夹(或根项目中的另一个文件夹)中的文本加载内容,然后将结果输出到屏幕上。当您只需要读取数据而不需要写入数据时,这很有用。

第二个例子稍微复杂一点。它不仅可以读取用户输入的内容,还可以将用户输入的内容写入文本文件。您将学习如何使用File 异步方法, 包括readAsString和writeAsString。

示例 1:加载内容

预览

此示例包含一个文本小部件和一个浮动按钮。当这个按钮被按下时,函数 _loadData将被触发并从文件中加载内容。

将文本文件添加到您的项目中

在项目根目录的资产文件夹中创建一个名为data.txt的新文本文件(如果尚不存在,则创建一个),并向其添加一些虚拟内容,如下所示:

个人简介:华为云享专家,InfoQ签约作者,51CTO博客首席体验官,专注于前端技术的分享,包括Flutter,小程序,安卓,VUE,JavaScript。如果你迷茫,不妨来瞅瞅码农的轨迹,

不要忘记在pubspec.yaml文件中注册assets文件夹:

flutter:
  assets:
    - assets/

完整代码

将以下内容添加到您的main.dart

// main.dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'dart:async';
​
void main() {
  runApp(MyApp());
}
​
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: '坚果',
      home: HomePage(),
    );
  }
}
​
class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}
​
class _HomePageState extends State<HomePage> {
  String _data;
​
  // This function is triggered when the user presses the floating button
  Future<void> _loadData() async {
    final _loadedData = await rootBundle.loadString('assets/data.txt');
    setState(() {
      _data = _loadedData;
    });
  }
​
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('坚果'),
      ),
      body: Center(
          child: Container(
              width: 300,
              child: Text(_data != null ? _data : 'Nothing to show',
                  style: TextStyle(fontSize: 24)))),
      floatingActionButton:
          FloatingActionButton(onPressed: _loadData, child: Icon(Icons.add)),
    );
  }
}

示例 2: Reading and Writing

获取文件路径

出于安全原因,Android 和 iOS 不允许我们在硬盘驱动器上的任何位置进行读写。我们需要将文本文件保存到Documents目录中,应用程序只能在该目录中访问其文件。只有在删除应用程序时才会删除这些文件。

文件目录是NSDocumentDirectory iOS和应用程序数据在Android上。要获取该目录的完整路径,我们使用path_provider包(这是 Flutter 的官方包)。

通过将path_provider及其版本添加到pubspec.yaml文件的依赖项部分来安装包,如下所示:

dependencies:
  path_provider: ^2.0.8

然后运行以下命令:

flutter pub get

并找到如下路径:

import 'package:path_provider/path_provider.dart';
​
/* .... */
​
Future<String> get _getDirPath async {
  final _dir = await getApplicationDocumentsDirectory();
  return _dir.path;
}

示例预览

此示例应用程序有一个 TextFiled,允许用户输入他/她的姓名以写入文本文件。它还包含一个文本小部件,显示从该文件读取的名称。

完整的代码和解释

在此示例中,我们不需要手动创建文本文件并将其添加到项目中。第一次写入数据时会自动创建。

这是我们的main.dart 中的代码:

// main.dart
import 'dart:convert';
​
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
​
void main() {
  runApp(MyApp());
}
​
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: '坚果',
      home: HomePage(),
    );
  }
}
​
class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}
​
class _HomePageState extends State<HomePage> {
  // This will be displayed on the screen
  String _content;
​
  // Find the Documents path
  Future<String> _getDirPath() async {
    final _dir = await getApplicationDocumentsDirectory();
    return _dir.path;
  }
​
  // This function is triggered when the "Read" button is pressed
  Future<void> _readData() async {
    final _dirPath = await _getDirPath();
    final _myFile = File('$_dirPath/data.txt');
    final _data = await _myFile.readAsString(encoding: utf8);
    setState(() {
      _content = _data;
    });
  }
​
  // TextField controller
  final _textController = TextEditingController();
  // This function is triggered when the "Write" buttion is pressed
  Future<void> _writeData() async {
    final _dirPath = await _getDirPath();
    
    final _myFile = File('$_dirPath/data.txt');
    // If data.txt doesn't exist, it will be created automatically
​
    await _myFile.writeAsString(_textController.text);
    _textController.clear();
  }
​
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('坚果'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(20),
        child: Column(
          children: [
            TextField(
              controller: _textController,
              decoration: InputDecoration(labelText: 'Enter your name'),
            ),
            ElevatedButton(
              child: Text('Save to file'),
              onPressed: _writeData,
            ),
            SizedBox(
              height: 150,
            ),
            Text(
                _content != null
                    ? _content
                    : 'Press the button to load your name',
                style: TextStyle(fontSize: 24, color: Colors.pink)),
            ElevatedButton(
              child: Text('Read my name from the file'),
              onPressed: _readData,
            )
          ],
        ),
      ),
    );
  }
}

以上就是详解Flutter如何读写文本文件的详细内容,更多关于Flutter读写文本文件的资料请关注脚本之家其它相关文章!

相关文章

  • Android实现拍照、录像、录音代码范例

    Android实现拍照、录像、录音代码范例

    这篇文章主要介绍了Android实现拍照、录像、录音代码的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-10-10
  • Android编程实现获取新浪天气预报数据的方法

    Android编程实现获取新浪天气预报数据的方法

    这篇文章主要介绍了Android编程实现获取新浪天气预报数据的方法,涉及Android基于新浪接口的调用及数据处理技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 详解Android开发数据持久化之文件存储(附源码)

    详解Android开发数据持久化之文件存储(附源码)

    本篇文章主要介绍了详解Android开发数据持久化之文件存储(附源码),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Android 解决sqlite无法创建新表的问题

    Android 解决sqlite无法创建新表的问题

    这篇文章主要介绍了Android 解决sqlite无法创建新表的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Kotlin基础学习之Deprecated与Suppress注解使用

    Kotlin基础学习之Deprecated与Suppress注解使用

    这篇文章主要给大家介绍了关于Kotlin基础学习之Deprecated与Suppress注解使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Kotlin具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Android直播系统平台搭建之图片实现阴影效果的方法小结

    Android直播系统平台搭建之图片实现阴影效果的方法小结

    这篇文章主要介绍了Android直播系统平台搭建, 图片实现阴影效果的若干种方法,本文给大家带来三种方法,每种方法通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • flutter的环境安装配置问题及解决方法

    flutter的环境安装配置问题及解决方法

    Flutter是Google推出的基于Dart语言开发的跨平台开源UI框架,旨在统一纷纷扰扰的跨平台开发框架,在UI层面上多端共用一套Dart代码来实现多平台适配开发,这篇文章主要介绍了flutter的环境安装配置问题,需要的朋友可以参考下
    2020-06-06
  • 多语言切换在Androidx失效的踩坑解决记录

    多语言切换在Androidx失效的踩坑解决记录

    这篇文章主要为大家介绍了多语言切换在Androidx失效的踩坑解决记录详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Android PowerManagerService省电模式策略控制

    Android PowerManagerService省电模式策略控制

    这篇文章主要介绍了Android PowerManagerService省电模式策略控制,本文基于前两篇文章的基础介绍展开详情,感兴趣的小伙伴可以参考一下
    2022-08-08
  • Android 图片添加水印的实现方法

    Android 图片添加水印的实现方法

    这篇文章主要介绍了Android 图片添加水印的实现方法的相关资料,添加水印的原理就是在画布Canvas上绘制图形、图片、文字等等, 得到你想要的效果图片,需要的朋友可以参考下
    2017-07-07

最新评论