Bird
Raised Fist0
Fluttermobile~5 mins

File storage in Flutter

Choose your learning style10 modes available
Introduction

File storage lets your app save data on the device. This helps keep information even after the app closes.

Saving user notes or documents locally on the device.
Storing images or files downloaded from the internet.
Keeping app settings or preferences that need to persist.
Caching data to improve app speed without internet.
Saving logs or reports generated by the app.
Syntax
Flutter
import 'dart:io';
import 'package:path_provider/path_provider.dart';

Future<String> get _localPath async {
  final directory = await getApplicationDocumentsDirectory();
  return directory.path;
}

Future<File> get _localFile async {
  final path = await _localPath;
  return File('$path/filename.txt');
}

Future<void> writeData(String data) async {
  final file = await _localFile;
  await file.writeAsString(data);
}

Future<String> readData() async {
  try {
    final file = await _localFile;
    String contents = await file.readAsString();
    return contents;
  } catch (e) {
    return 'Error reading file';
  }
}

Use path_provider package to find safe storage locations.

File operations are asynchronous to avoid freezing the app.

Examples
This writes the text 'Hello Flutter!' to the file.
Flutter
final file = await _localFile;
await file.writeAsString('Hello Flutter!');
This reads the text content from the file.
Flutter
final file = await _localFile;
String content = await file.readAsString();
This gets a temporary folder path for short-term files.
Flutter
final directory = await getTemporaryDirectory();
print(directory.path);
Sample App

This app has two buttons: one to save text to a file, and one to read it back. The saved text shows below the buttons.

Flutter
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _data = '';

  Future<String> get _localPath async {
    final directory = await getApplicationDocumentsDirectory();
    return directory.path;
  }

  Future<File> get _localFile async {
    final path = await _localPath;
    return File('$path/data.txt');
  }

  Future<void> _writeData(String data) async {
    final file = await _localFile;
    await file.writeAsString(data);
  }

  Future<void> _readData() async {
    try {
      final file = await _localFile;
      String contents = await file.readAsString();
      setState(() {
        _data = contents;
      });
    } catch (e) {
      setState(() {
        _data = 'No data found.';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('File Storage Example')),
        body: Padding(
          padding: EdgeInsets.all(16),
          child: Column(
            children: [
              ElevatedButton(
                onPressed: () async {
                  await _writeData('Hello from Flutter!');
                },
                child: Text('Write Data'),
              ),
              SizedBox(height: 10),
              ElevatedButton(
                onPressed: _readData,
                child: Text('Read Data'),
              ),
              SizedBox(height: 20),
              Text('File content:'),
              SizedBox(height: 10),
              Text(_data, style: TextStyle(fontSize: 18)),
            ],
          ),
        ),
      ),
    );
  }
}
OutputSuccess
Important Notes

Always handle errors when reading files to avoid crashes.

Files saved in app documents folder are private to your app.

Use asynchronous calls to keep the app responsive.

Summary

File storage saves data on the device to keep it between app uses.

Use path_provider to find safe folders for files.

Read and write files asynchronously to avoid freezing the app.

Practice

(1/5)
1. What is the main purpose of using file storage in a Flutter app?
easy
A. To speed up the app's animations
B. To save data on the device so it stays after the app closes
C. To connect to the internet faster
D. To change the app's theme colors

Solution

  1. Step 1: Understand file storage purpose

    File storage keeps data saved on the device even when the app is closed.
  2. Step 2: Compare options

    Only To save data on the device so it stays after the app closes describes saving data persistently on the device.
  3. Final Answer:

    To save data on the device so it stays after the app closes -> Option B
  4. Quick Check:

    File storage = save data persistently [OK]
Hint: File storage keeps data after app closes [OK]
Common Mistakes:
  • Confusing file storage with internet speed
  • Thinking file storage changes UI appearance
  • Assuming file storage affects animations
2. Which Flutter package is commonly used to find safe directories for file storage?
easy
A. path_provider
B. shared_preferences
C. flutter_local_notifications
D. http

Solution

  1. Step 1: Identify package for file paths

    The path_provider package helps find safe folders like documents or temporary directories.
  2. Step 2: Eliminate other packages

    http is for web requests, flutter_local_notifications for notifications, and shared_preferences for simple key-value storage, not file paths.
  3. Final Answer:

    path_provider -> Option A
  4. Quick Check:

    Safe file paths = path_provider [OK]
Hint: Use path_provider to get file directories [OK]
Common Mistakes:
  • Choosing http instead of path_provider
  • Confusing shared_preferences with file storage
  • Not knowing which package manages file paths
3. What will the following Flutter code print if the file contains the text "Hello Flutter"?
final file = File('example.txt');
String contents = await file.readAsString();
print(contents);
medium
A. null
B. File not found error
C. example.txt
D. Hello Flutter

Solution

  1. Step 1: Understand readAsString()

    The method readAsString() reads the file content as a string asynchronously.
  2. Step 2: Check printed output

    The variable contents holds the file text "Hello Flutter", so printing it outputs that text.
  3. Final Answer:

    Hello Flutter -> Option D
  4. Quick Check:

    readAsString() returns file text [OK]
Hint: readAsString() prints file content [OK]
Common Mistakes:
  • Expecting filename instead of content
  • Assuming null if file exists
  • Confusing error with normal output
4. Identify the error in this Flutter code snippet for writing text to a file:
final file = File('data.txt');
file.writeAsString('Save this text');
print('File saved');
medium
A. print statement should come before writeAsString
B. File path 'data.txt' is invalid on mobile devices
C. writeAsString must be awaited or handled asynchronously
D. File class cannot write strings, only bytes

Solution

  1. Step 1: Check writeAsString usage

    The method writeAsString is asynchronous and returns a Future, so it should be awaited or handled with then() to ensure completion.
  2. Step 2: Analyze code flow

    Without awaiting, print('File saved') runs immediately, possibly before writing finishes, causing logic errors.
  3. Final Answer:

    writeAsString must be awaited or handled asynchronously -> Option C
  4. Quick Check:

    Async write needs await [OK]
Hint: Always await async file writes [OK]
Common Mistakes:
  • Ignoring async nature of writeAsString
  • Assuming file path 'data.txt' is always valid
  • Thinking print order affects file writing
5. You want to save user notes persistently in a Flutter app. Which approach correctly combines getting a safe directory and writing a text file asynchronously?
import 'dart:io';
import 'package:path_provider/path_provider.dart';

Future<void> saveNote(String note) async {
  final dir = await getApplicationDocumentsDirectory();
  final file = File('${dir.path}/note.txt');
  await file.writeAsString(note);
}
hard
A. Correctly gets directory and writes file asynchronously
B. Uses wrong directory method, should use getTemporaryDirectory()
C. Missing await before getApplicationDocumentsDirectory()
D. File path concatenation is incorrect, needs '+' operator

Solution

  1. Step 1: Check directory retrieval

    The code uses await getApplicationDocumentsDirectory() which is the correct method to get a safe persistent directory.
  2. Step 2: Verify file writing

    It creates a File with path combining directory path and filename, then awaits writeAsString to save the note asynchronously.
  3. Step 3: Confirm string interpolation

    Using '${dir.path}/note.txt' correctly builds the file path as a string.
  4. Final Answer:

    Correctly gets directory and writes file asynchronously -> Option A
  5. Quick Check:

    Async write + safe directory = correct [OK]
Hint: Use getApplicationDocumentsDirectory and await writes [OK]
Common Mistakes:
  • Using temporary directory for persistent data
  • Forgetting await on async calls
  • Incorrect string concatenation for file path
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard