在启动屏幕上,检查用户的 cookie。因此,如果用户登录应用程序或已有 cookie,则会执行以下代码。
_navigateToHome() {
Timer(
const Duration(seconds: 3),
() {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => ChangeNotifierProvider<ExerciseProvider>(
create: (_) => ExerciseProvider(),
child: const HomeScreen(),
),
),
);
},
);
}
现在,我使用 flutter_provider 包来更轻松地处理数据。所以我制作了ExerciseProvider并使用了notifyListners()。然后像上面的代码一样,我用 ChangeNotifierProvider() 包装了 HomeScreen。
下面的代码是关于提供者的
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:workout_app/utilities/api.dart';
class ExerciseProvider with ChangeNotifier {
final List list = [];
List getWorkoutList() {
_fetchWorkouts();
return list;
}
void _fetchWorkouts() async {
Response res = await GetApi(apiUrl: "/workout").getData();
final result = res.data;
list.clear();
list.addAll(result);
notifyListeners();
}
}
我可以很好地使用数据,但是当我从该提供程序打印数据时,数据会变得无限。 (我认为notifyListners()被无限调用)。
@override
Widget build(BuildContext context) {
print("list: ${context.watch<ExerciseProvider>().getWorkoutList()}");
return Scaffold(
...
我该怎么办?可以吗?
尝试将“观看”替换为“阅读”
@override
Widget build(BuildContext context) {
print("list: ${context.read<ExerciseProvider>().getWorkoutList()}");
return Scaffold(
...
解释
提供的代码片段使用 context.watch() 从提供者检索数据。然而,使用 watch() 意味着小部件将“监听”数据的更改,并在数据更改时重建自身。在这种特定情况下,小部件在 build() 方法内调用 context.watch().getWorkoutList() 。这会触发调用 _fetchWorkouts() 的连锁反应,进而通知侦听器,导致再次调用 build() 方法,从而导致无限循环。