使用单例模式时,Flutter 的共享首选项有时不会初始化 - 所有文件都有一个实例

问题描述 投票:0回答:1

因此,我创建了一个类,用于使用

shared_preferences
和单例模式,这样我就可以在所有文件中使用一个实例。

几乎所有时候它都能完美地工作,但偶尔,当我不使用该应用程序但它仍然在后台打开时,然后打开它,我会看到灰屏,因为我的 _prefs 无法获取数据(可能是因为未初始化)。我无法调试测试它,因为它只出现在发布模式下。 我不再使用

shared_preferences
中的任何方法,例如
SharedPreferences.clear()
SharedPreferences.setMockInitialValues({});
。另外,我只是在我的 main() 函数中初始化它们(代码如下)。

我想知道我是否做错了什么,没有正确初始化它或者在设置和检索数据之前没有检查它是否已初始化。 有谁知道可能出了什么问题吗?也许我需要采取不同的方法?

定制类:

class SharedUserData {
  // home screen dailies
  static const String _APP_CURRENT_DATA_SEED = 'app_current_data_seed';
  static const String _CHOSEN_DAILY_PHYSICS_QUESTION_ANSWER_INDEX= 'chosen_daily_physics_question_index';

  SharedPreferences? _prefs;

  // SINGLETON
  SharedUserData._privateConstructor();
  static final SharedUserData _instance = SharedUserData._privateConstructor();
  static SharedUserData get instance => _instance;


  Future<void> init() async {
    _prefs = await SharedPreferences.getInstance();
  }

  void initializeHomeScreenDailies() {
    int? writtenDateSeed = readCurrentDataSeed();
    int calculatedDateSeed = calculateCurrentDateSeed();

    if(writtenDateSeed == null || writtenDateSeed != calculatedDateSeed) {
      writeCurrentDataSeed(calculatedDateSeed);
      writeChosenDailyPhysicsQuestionAnswerIndex(-1);
    }

    printAllData();
  }


  // READ METHODS
  int? readCurrentDataSeed() {
    assert(_prefs != null, 'SharedPreferences not initialized. Call init() first.');
    return _prefs!.getInt(_APP_CURRENT_DATA_SEED);
  }
  int? readChosenDailyPhysicsQuestionAnswerIndex() {
    assert(_prefs != null, 'SharedPreferences not initialized. Call init() first.');
    return _prefs!.getInt(_CHOSEN_DAILY_PHYSICS_QUESTION_ANSWER_INDEX);
  }

  // WRITE METHODS
  Future<void> writeCurrentDataSeed(int currentDataSeed) async {
    assert(_prefs != null, 'SharedPreferences not initialized. Call init() first.');
    await _prefs!.setInt(_APP_CURRENT_DATA_SEED, currentDataSeed);
  }
  Future<void> writeChosenDailyPhysicsQuestionAnswerIndex(int chosenDailyPhyscisQuestionAnswerIndex) async {
    assert(_prefs != null, 'SharedPreferences not initialized. Call init() first.');
    await _prefs!.setInt(_CHOSEN_DAILY_PHYSICS_QUESTION_ANSWER_INDEX, chosenDailyPhyscisQuestionAnswerIndex);
  }
}

我正在我的

main.dart
文件中初始化它,如下所示:

void main() {
  initializeSharedPreferences();

  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

void initializeSharedPreferences() async {
  WidgetsFlutterBinding.ensureInitialized();

  await SharedUserData.instance.init();
  SharedUserData.instance.initializeHomeScreenDailies();
}

并使用like(在函数中):

final int? seed = SharedUserData.instance.readCurrentDataSeed();

我只尝试研究它,但似乎我找不到也发生此问题的任何地方。

flutter sharedpreferences flutter-sharedpreference
1个回答
0
投票

由于您从

async
调用
main
函数,因此您应该使
main
也成为
async
并使用
await
等待
initializeSharedPreferences
完成。

试试这个:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await initializeSharedPreferences(); 
  runApp(MyApp());
}

Future<void> initializeSharedPreferences() async {
  await SharedUserData.instance.init();
  SharedUserData.instance.initializeHomeScreenDailies();
}

© www.soinside.com 2019 - 2024. All rights reserved.