美文网首页
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管理全局状态并且使用依赖注入

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