flutter shared_preferences 異步變同步


前言

在開發原生iOS或Native應用時,一般有判斷上一次安裝的版本和當前版本是否是同一個版本,如果不是同一個版本,則要顯示引導頁,這個過程是把版本號持久化存儲起來,在每一次啟動時進行判斷,這個過程必須是同步的,但flutter > 提供的shared_preferences和package_info卻都是異步的

解決方案:

1、在pubspec.yaml里配置依賴packages

# 依賴庫
dependencies:
  flutter:
    sdk: flutter
  #數據存儲
  shared_preferences: ^0.5.2+1
  #獲取版本號等信息
  package_info: ^0.4.0+3 

2、使用一個工具類持有一個靜態的shared_preferences和package_info

import 'package:shared_preferences/shared_preferences.dart';
import 'package:package_info/package_info.dart';
class SpUtil{
  static SharedPreferences preferences;
  static PackageInfo packageInfo;
  static Future<bool> getInstance() async{
     preferences = await SharedPreferences.getInstance();
     packageInfo = await PackageInfo.fromPlatform();
     return true;
  }
}

3、在main方法里先調用初始化方法,再調用runApp方法

void main() {
  realRunApp();
} 
void realRunApp() async {
  bool success = await SpUtil.getInstance();
  print("init-"+success.toString());
  runApp(MyApp());
} 

4、在需要使用時就可以同步調用了

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    
    Widget rootPage;
    String version = SpUtil.packageInfo.version;
    String oldVersion = SpUtil.preferences.getString('oldVersion');
    if(version == oldVersion){
      // 如果已經顯示過了則直接顯示tab
        rootPage = TabBarPage();
    }else{
      // 沒有顯示過guide,則優先顯示guide
        rootPage = CircleGuidePage();
    }
    return MaterialApp(
      title: 'MyApp',
      debugShowCheckedModeBanner: true,
      home: rootPage,
    );
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM