我有一个字典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( )
时,它会再次加载吗?或者一旦加载,它将不会再次运行?谢啦,谢啦
1条答案
按热度按时间7kqas0il1#
第一种方法是基于类的提供程序,创建一个可见的通告子类来管理状态,并提供可能的变异方法来更新状态。
第二种方法是基于函数的提供程序,创建一个隐藏的通告子类来管理状态,但不提供放置变异方法来更新状态的位置。当通知程序基于来自其他外部输入的输入,而不是由方法调用驱动以触发变化时,可以使用此方法。不使用生成器的这种策略的例子有Provider、FutureProvider和StreamProvider。