【问题标题】:What is best practise with flutter provider to lazy load data什么是颤振提供者延迟加载数据的最佳实践
【发布时间】:2021-12-02 06:23:32
【问题描述】:

所以当使用flutter的provider时,主要的问题是,如果想要指定provider,它的后代需要它的值和它的好,直到你不使用导航,如果我们使用导航,那么我们必须使用builder来提供新的上下文所以对于大多数人来说,在小部件层次结构中的材料应用程序之前提供所有提供程序,但是问题在于,假设我想加载一个将在第二个屏幕上加载的数据,所以我想把什么放在初始模型类中,因为我不认为提供空值是一个好方法。

所以我的问题是在不使用 null 或默认空值的情况下延迟加载数据的最佳方法是什么。

有关我的问题的一些上下文,请参见下面的代码。

class App extends StatelessWidget {
  const App({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    const title = 'GPA Calculator';
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (context) => StudentManager()),
        ChangeNotifierProvider(create: (context) => StudentCourseManager()),
      ],
      child: MaterialApp(
        title: title,
        home: const HomeScreen(title: title),
      ),
    );
  }
}

class StudentManager extends ChangeNotifier {
  List<Student> _list = [];

  List<Student> get list => _list;

  void add(Student student) {
    _list.add(student);
    notifyListeners();
  }

  void remove(int index) {
    _list.removeAt(index);
    notifyListeners();
  }

  void update(
    int index,
    Student student,
  ) {
    _list[index] = student;
    notifyListeners();
  }
}

class StudentCourseManager extends ChangeNotifier {
  late int studentIndex;
  late StudentManager studentManager;

  StudentCourseManager({
    required this.studentIndex,
    required this.studentManager,
  });

  Student? get student => studentManager.list[studentIndex];

  List<StudentCourse> get list => student != null ? student!.courseList : [];

  void add(StudentCourse studentCourse) {
    student!.addCourse(studentCourse);
    studentManager.update(studentIndex, student!);
    notifyListeners();
  }

  void delete(int index) {
    student!.deleteCourse(index);
    studentManager.update(studentIndex, student!);
    notifyListeners();
  }

  void update(
    int index,
    StudentCourse studentCourse,
  ) {
    student!.updateCourse(index, studentCourse);
    studentManager.update(studentIndex, student!);
    notifyListeners();
  }
}

【问题讨论】:

  • 您是否已经尝试过 ChangeNotifierProxyProvider?
  • 谢谢你,我不知道它解决了我的问题

标签: flutter dart flutter-provider


【解决方案1】:

根据@Nico Spencer 的评论,我尝试了ChangeNotifierProxyProvider,我发现它是对我旧方法的改进,因为它只是我的代码,而且这里的自动更新提供程序是我更改的代码。

//...
providers: [
        ChangeNotifierProvider<StudentManager>(
          create: (context) => StudentManager(),
        ),
        ChangeNotifierProxyProvider<StudentManager, StudentCourseManager>(
          create: (context) => StudentCourseManager(),
          update: (context, result, previous) {
            return previous!..student = result.currentStudent;
          },
        ),
      ],

class StudentCourseManager extends ChangeNotifier {
  late Student student;

  List<StudentCourse> get list => student.courseList;

  void add(StudentCourse studentCourse) {
    student.addCourse(studentCourse);
    notifyListeners();
  }

  void delete(int index) {
    student.deleteCourse(index);
    notifyListeners();
  }

  void update(
    int index,
    StudentCourse studentCourse,
  ) {
    student.updateCourse(index, studentCourse);
    notifyListeners();
  }
}


// ...
return StudentTile(
          student: student,
          onDelete: () => studentManager.remove(index),
          onTap: () {
            studentManager.currentStudent = student;

            Navigator.push<void>(
              context,
              MaterialPageRoute(builder: (context) => const CoursesScreen()),
            );
          },

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多