Flutter 使用提供程序无限获取数据

问题描述 投票:0回答:1

在启动屏幕上,检查用户的 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(
        ...

我该怎么办?可以吗?

flutter flutter-dependencies provider flutter-provider
1个回答
0
投票

尝试将“观看”替换为“阅读”

@override
      Widget build(BuildContext context) {
        print("list: ${context.read<ExerciseProvider>().getWorkoutList()}");
        return Scaffold(
            ...

解释

提供的代码片段使用 context.watch() 从提供者检索数据。然而,使用 watch() 意味着小部件将“监听”数据的更改,并在数据更改时重建自身。在这种特定情况下,小部件在 build() 方法内调用 context.watch().getWorkoutList() 。这会触发调用 _fetchWorkouts() 的连锁反应,进而通知侦听器,导致再次调用 build() 方法,从而导致无限循环。

© www.soinside.com 2019 - 2024. All rights reserved.