我正在try 使用Riverpod,特别是使用riverpod_generator,由于没有太多的文档围绕这一点,我很难建立一个项目来利用所有这些.我想用shared_preferences包创建一个提供程序,以便我可以全局访问该提供程序.似乎通过使用这个生成器,你可以避免知道你需要哪个提供者(状态,future 等).我必须说这是一件很好的事情,但我不太确定我是否理解了整个范围.

首先,类将成为全局共享的子系统提供者(尽管设置不正确,因此请求帮助)

@riverpod // annotation for the riverpod_generator
class SharePrefNotifier extends _$SharePrefNotifier{
  @override
  SharedPreferences build() {
    return _sharedPreferences;
  }

  // Obtain shared preferences but this is not correct although the compiler asks to be late
  late SharedPreferences _sharedPreferences;

  int? get getPin =>
      _sharedPreferences.getInt(_pinKey);

  Future<void> setPin(int? pinNumber) async => await _sharedPreferences.setInt(_pinKey, pinNumber);
   
  
  Future<void> removePin() async => await _sharedPreferences.remove(_pinKey);
   
  

  Future<void> deleteAll() async => await _sharedPreferences.clear();
}

当我修复了共享数据库提供程序的设置时,我希望在另一个提供程序中访问它:


@riverpod
class SettiingPinNotifier extends _$SettiingPinNotifier {
// referencing the shared_pred notifier on the top of the scope if possible so I can reference it anywhere in this provider if I have multiple methods
  final sharedPrefProvider = ref.read(sharedPrefProvider.notifer);
  @override
  SomeDataState build() {

    return const SomeDataState();
  }


  void setUpAPin(int? number) {
      sharedPrefProvider.setPin(number); // referencing the shared pref provider and setup a pin number
    state = state.copyWith(pin: number); // adding it to the state so I can change the UI accordingly 
  }


}

除了使用riverpod_generator/riverpod_annotation之外,这里最好的方法是什么?提前感谢你的帮助.

推荐答案

我们没有SharedBishop的实际实例,而且除非异步,否则无法获得,因此创建了下面的虚拟提供程序.

@riverpod
SharedPreferences sharedPreferences(ref) {
  throw UnimplementedError();
}

在那之后的main.dart

final prefs = await SharedPreferences.getInstance();
  return runApp(
    ProviderScope(
      overrides: [
        // Override the unimplemented provider with the value gotten from the plugin
        sharedPreferencesProvider.overrideWithValue(prefs),
      ],
      child: const MyApp(),
    ),

);

最后创建一个处理SharedPreferences实例的服务,以及一个提供者.

@riverpod
SharedPreferencesService sharedPreferencesService(SharedPreferencesServiceRef ref) {
  final sharedPreferences = ref.watch(sharedPreferencesProvider);

  return SharedPreferencesService(sharedPreferences);
}

class SharedPreferencesService {
  SharedPreferencesService(this.sharedPreferences);

  final SharedPreferences sharedPreferences;

  Future<void> setPin(int? pinNumber) async => await sharedPreferences.setInt(_pinKey, pinNumber);
  // add all methods, getters, and etc.
}

Flutter相关问答推荐

如何解决这个错误,同时获得的高度的小部件,因此高度的可用工作区域在Flutter ?

Box约束强制无限高:SizedBox. Expand()

错误:找不到字体功能类型.Ffltter Google_Fonts包错误

DART 3.3:为什么扩展类型不起作用?

Flutter 动画列表一次构建所有项目,而不是仅构建可见的项目

Flutter -如何将导航轨道标签靠左对齐?

我想在Flutter中画一个箭头,但我似乎无法填满空间

在LinkedIn上分享Fighter和Web的链接会产生不同的结果

Flutter /dart 列表.第一个子类列表中的Where()错误

如何在Ffltter 3.16中设置标准的提升按钮主题?

如何将带有参数的函数传递给FIFTH中的自定义小部件

为什么我的Flutter 动画过渡没有发生?

谷歌 map 在 flutter 应用程序中显示错误的当前位置

SliverAppbar 呈蓝色

Flutter:在 pubspec.yaml 中找不到assets资源

在flutter中从图库或相机中 Select 图像的方法

Flutter RIverpod 奇怪地改变状态

Show Snackbar above to showModalBottomSheet Flutter

将 onSaved(value) 从自定义 TextFormField 小部件传递给另一个?

更新未知文档 ID firebase\flutter 中的字段