美文网首页
flutter管理全局状态并且使用依赖注入

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

作者: Poppy11 | 来源:发表于2023-12-17 11:14 被阅读0次

如果我们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';

相关文章

  • Flutter Provider 迄今为止最深、最全、最新的源码

    回顾 Flutter State Management状态管理全面分析上期我们对Flutter的状态管理有了全局的...

  • Flutter 使用provider进行全局状态管理

    Flutter 使用provider进行全局状态管理 1. 导入provider 2. 创建一个provider ...

  • iOS ---单例

    请尽量避免使用单例而是依赖注入。占内存, 而且全局的东西状态不易改变, 不够灵活. 然而,如果一定要用,请使用一...

  • GETX

    GetX 是 Flutter 上的一个轻量且强大的解决方案:高性能的状态管理、智能的依赖注入和便捷的路由管理。 1...

  • 文科生也编程 - GetX的简单使用

    GetX简介 GetX是Flutter的轻便而强大的解决方案,它结合了高性能状态管理,智能依赖注入和快速实用的路由...

  • GetX Obx实现原理探索

    一.GetX是什么? GetX 是 Flutter 上的一个轻量且强大的解决方案:高性能的状态管理、智能的依赖注入...

  • Flutter框架 - GetX

    GetX是什么 GetX 是 Flutter 上的一个轻量且强大的解决方案:高性能的状态管理、智能的依赖注入和便捷...

  • Flutter-Provider 全局状态管理使用

    方案: Scoped Model Redux: bloc state Provide 案例: 在页面上增加Text...

  • @ngrx/store 源码分析

    前言 @ngrx/store 作为 Angular 的状态管理库,在实现上必然离不开依赖注入,所以不清楚依赖注入概...

  • Flutter状态管理官方文档笔记

    状态管理是flutter学习过程中很重要的部分,能够深入的理解局部状态和全局状态,那么在以后的flutter学习和...

网友评论

      本文标题:flutter管理全局状态并且使用依赖注入

      本文链接:https://www.haomeiwen.com/subject/yvzbgdtx.html