flutter Riverpod 2.0 FutureProvider正确使用

unhi4e5o  于 2023-08-07  发布在  Flutter
关注(0)|答案(1)|浏览(263)

我有一个字典JSON文件,我想加载一次,当我的应用程序启动时,我不确定我应该怎么做。我的第一个方法就是这样做

@Riverpod(keepAlive: true)
class AppDictionary extends _$AppDictionary {
  @override
  FutureOr<List<DictionaryEntry>> build() async {
    return await _parseDictionary();
  }

  Future<List<DictionaryEntry>> _parseDictionary() async {
    try {
      final response = await rootBundle.loadString('assets/dict.json');
      final data = await json.decode(response) as List<dynamic>;
      final parsedData = data
          .map((e) => DictionaryEntry.fromMap(e as Map<String, dynamic>))
          .toList();

      return parsedData;
    } catch (e) {
      print(e);
      rethrow;
    }
  }
}

字符串
在我最初的页面里我这样做了

final asyncDictionary = ref.watch(appDictionaryProvider);

if (asyncDictionary.isLoading) {
  return const Scaffold(
    body: Center(child: CircularProgressIndicator()),
  );
}


而且它工作得很好。但是在Riverpod文档中阅读了FutureProvider,我发现我可以用这种方法来实现

@riverpod
Future<List<DictionaryEntry>> loadDictionary(LoadDictionaryRef ref) async {
  try {
    final response = await rootBundle.loadString('assets/dict.json');
    final data = await json.decode(response) as List<dynamic>;
    final parsedData = data
        .map((e) => DictionaryEntry.fromMap(e as Map<String, dynamic>))
        .toList();

    return parsedData;
  } catch (e) {
    print(e);
    rethrow;
  }
}


第二种方法也奏效了,所以我想知道哪种方法最好。还有,第二种方式,每次调用ref.watch( )时,它会再次加载吗?或者一旦加载,它将不会再次运行?谢啦,谢啦

7kqas0il

7kqas0il1#

第一种方法是基于类的提供程序,创建一个可见的通告子类来管理状态,并提供可能的变异方法来更新状态。
第二种方法是基于函数的提供程序,创建一个隐藏的通告子类来管理状态,但不提供放置变异方法来更新状态的位置。当通知程序基于来自其他外部输入的输入,而不是由方法调用驱动以触发变化时,可以使用此方法。不使用生成器的这种策略的例子有Provider、FutureProvider和StreamProvider。

相关问题