启动时的颤振加载json数据



我的问题是,在显示屏幕之前。它应该在显示闪屏时加载必要的数据。

它工作得很好,直到它转到create提供程序,由于列表被重新创建,已经加载到列表中的数据正在被清除。我想知道我该如何解决这个问题?我该如何将data (json)文件加载到列表中呢?

void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late Future<void> loadJson;
@override
void initState() {
loadJson = QuestionProvider().loadJsonFiles();
super.initState();
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: loadJson,
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const MaterialApp(home: Splash());
} else {
return MultiProvider(
providers: [
ChangeNotifierProvider<QuestionProvider>(create: (_) => QuestionProvider()),
],
child: MaterialApp(
title: "MyApp",
theme: ThemeData(
primarySwatch: Colors.amber,
),
home: const Home(),
)
);
}
},
);
}
}
class QuestionProvider with ChangeNotifier {
final List<QuestionModel> questionList = <QuestionModel>[];

Future<void> loadJsonFiles() async {
final String response = await rootBundle.loadString("assets/questions.json");
final Map<String, dynamic> data = await jsonDecode(response);
for (int i = 0; i < data.length; i++) {
questionList.add(QuestionModel.fromJson(data[i]));
}
}
}

为什么不颠倒未来的构建者和提供者?

Widget build(BuildContext context) {
return MultiProvider(
[...],
child: Builder(
builder: (context) => 
FutureBuilder(
future: Provider.of<QuestionProvider>().loadJsonFiles,
child: [...]
),
),
);
}

这个方法可能有也可能没有缺点,特别是,未来的值不再被缓存,如果你担心这个,我建议你在QuestionProvider类本身中缓存值。