Метод » XXX » был вызван с нулевым значением

#flutter

Вопрос:

Я настоящий новичок в flutter и хотел бы обратиться к вам за помощью для решения следующей проблемы:

Я хочу записать текущее время в файл, но отображается следующая ошибка:

= = = = = = = Исключение, обнаруженное библиотекой виджетов =====================

В Builder была вызвана следующая ошибка noSuchMethod: метод «writeStartTimeString» был вызван при значении null. Получатель: null Попытался вызвать: writeStartTimeString(«1629015208721»)

Вот мой код:

 
**startTimeStorage.dart**

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

class StartTimeStorage {
  Future<String> get _localPath async {
    final directory = await getApplicationDocumentsDirectory();

    return directory.path;
  }

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

  Future<String> readStartTimeString() async {
    try {
      final file = await _localFile;

      // Read the file
      final contents = await file.readAsString();
      print('reading');
      print(contents);
      return contents;
    } catch (e) {
      // If encountering an error, return ''
      return '';
    }
  }

  Future<File> writeStartTimeString(String startTimeString) async {
    final file = await _localFile;
    print('writing');
    print(startTimeString);
    // Write the file
    return file.writeAsString(startTimeString);
  }
}

 
 **main File:**

class ParkingTimerScreen extends StatefulWidget {

  StartTimeStorage startTimeStorage;

  _ParkingTimerScreen createState() => _ParkingTimerScreen();
}

class _ParkingTimerScreen extends State<ParkingTimerScreen> {
  @override
  void initState() {
    super.initState();

    var _timestamp = DateTime.now().millisecondsSinceEpoch;
    print('printing _timestamp:$_timestamp');

    //Writing to file, ***where error appears.***
    widget.startTimeStorage.writeStartTimeString(_timestamp.toString());


    //Reading from file and store the value to startTimeString
    widget.startTimeStorage.readStartTimeString().then((String value) {
      startTimeString = value;
    });

//...other code.....
//.....

}
 

Комментарии:

1. Вы не инициализируете startTimeStorage . По крайней мере, не в показанном коде.

Ответ №1:

Вы должны инициализировать переменную StartTimeStorage в классе ParkingTimeScreen.

 class ParkingTimerScreen extends StatefulWidget {

  StartTimeStorage startTimeStorage = StartTimeStorage();

  _ParkingTimerScreen createState() => _ParkingTimerScreen();
}
 

Ответ №2:

вы должны использовать инициализатор

в вашем главном ParkingTimerScreen виджете файла получите startTimeStorage , но вы не инициализировали его, и приложение выдает эту ошибку

потому startTimeStorage что имеет значение null и readStartTimeString вызывает переменную null

 class ParkingTimerScreen extends StatefulWidget {

  StartTimeStorage startTimeStorage;
  ParkingTimerScreen({required this.startTimeStorage});

  _ParkingTimerScreen createState() => _ParkingTimerScreen();
}