flutter管理全局状态并且使用依赖注入

2023-12-17  本文已影响0人  Poppy11

如果我们App需要存储一些用户偏好,等一些基本设置的一些简单数据,我们可以选择使用这个库。因为官方文档也介绍,这个存储并不是百分百能存储到磁盘中,所以存一些简单数据是完全没问题的。

此处介绍的是shared_preferences + get_it , 也就是整理了一下关于shared_preferences的最佳实践。

get_it 是一个在 Dart/Flutter 中用于依赖注入的库。依赖注入是一种设计模式,它可以帮助管理应用程序中的对象依赖关系,并提供一种解耦的方式来访问这些对象。
get_it 库的主要目的是提供一个全局的服务定位器(Service Locator)来注册和获取对象实例。通过将对象注册到服务定位器中,可以在应用程序的不同部分中轻松地访问这些对象,而无需显式地创建它们的实例。

1.安装依赖

https://pub.dev/packages/shared_preferences
https://pub.dev/packages/get_it

flutter pub add shared_preferences
dart pub add get_it

2.配置

因为这个肯定是全局使用,所以不可能每个地方都创建一个实例,所以可以考虑封装一个单例类,如果使用get_it依赖注入,其实依赖注入的时候,我们就可以选择注入一个单例,所以这个class类,其实封不封装成单例都不太重要。
/lib/service/shared_preferences_service.dart

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

const String _kUserNameKey = 'counter';

class SharedPreferencesService {
  static SharedPreferencesService? _instance;
  static late SharedPreferences _preferences;

  SharedPreferencesService._();

  static Future<SharedPreferencesService> getInstance() async {
    _instance ??= SharedPreferencesService._();
    _preferences = await SharedPreferences.getInstance();
    return _instance!;
  }

  String get userNameValue => _getData(_kUserNameKey);
  set userNameValue(String value) => _saveData(_kUserNameKey, value);


  dynamic _getData(String key) {
    var value = _preferences.get(key);
    debugPrint('Retrieved $key: $value');
    return value;
  }

  void _saveData(String key, dynamic value) {
    debugPrint('Saving $key: $value');
    if (value is String) {
      _preferences.setString(key, value);
    } else if (value is int) {
      _preferences.setInt(key, value);
    } else if (value is double) {
      _preferences.setDouble(key, value);
    } else if (value is bool) {
      _preferences.setBool(key, value);
    } else if (value is List<String>) {
      _preferences.setStringList(key, value);
    }
  }
}

/lib/service/locator.dart

import 'package:flutter_application_1/services/shared_preferences_service.dart';
import 'package:get_it/get_it.dart';

final serviceLocator = GetIt.instance;

Future<void> setupServiceLocator() async {
  // Register services
  final sharedPreferencesService = await SharedPreferencesService.getInstance();
  serviceLocator.registerSingleton(sharedPreferencesService);
}

修改main.dart代码,因为使用到了get_it,所以需要等待都注入进去容器过后,我们再开始加载我们的App

final getIt = GetIt.instance;
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await setupServiceLocator();
  runApp(const MyApp());
}

3.使用

final sharedPrefService = serviceLocator<SharedPreferencesService>();

//获取值
sharedPrefService.userNameValue
//更新值
sharedPrefService.userNameValue = 'lisi';
上一篇 下一篇

猜你喜欢

热点阅读