首页 > 解决方案 > 无法调用 initState 和更新 (riverpod state_notifier)

问题描述

问题

我正在使用riverpod 和state_notifier。StateNotifier 有的 initState() 和 update() 被调用,没有。其他成员函数都可以调用成功。但是,可以成功调用其他成员函数。

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';

import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:riverpod_todo_list/todo_list_notifier.dart';
import 'package:riverpod_todo_list/todo_list_state.dart';
void main() {
  print('start~~');
  runApp(ProviderScope(child: MyApp()));
}

class MyApp extends HookWidget {
  // ...
}

final todoListProvider = StateNotifierProvider((_) => TodoListNotifier());

class MyHomePage extends HookWidget {
  final _controller = TextEditingController();
  final todoListNotifier = useProvider(todoListProvider);
  final TodoListState _todoListState =
      useProvider(todoListProvider.state.select((value) => value));
//...

import 'package:riverpod_todo_list/todo.dart';
import 'package:riverpod_todo_list/todo_list_state.dart';
import 'package:state_notifier/state_notifier.dart';
import 'package:uuid/uuid.dart';

class TodoListNotifier extends StateNotifier<TodoListState> with LocatorMixin {
  TodoListNotifier() : super(const TodoListState());

  Uuid _uuid = Uuid();

  // could not run.
  @override
  void initState() {
    super.initState();
    print('init state~~~'); 
  }

  // could not run.
  @override
  void update(Locator watch) {
    super.update(watch);
    print('update');
  }

  // could run.
  void add(String title) {
    Todo todo = Todo(id: _uuid.v4(), title: title);
    List<Todo> todoList = []..addAll(state.todoList);
    todoList.add(todo);

    state = state.copyWith(todoList: todoList);
  }

  // could run.
  void toggleStatus(int index) {
    List<Todo> todoList = []..addAll(state.todoList);
    todoList[index] = state.todoList[index]
        .copyWith(completed: !state.todoList[index].completed);
    state = state.copyWith(todoList: todoList);

    print('changed toggle~~');
  }
}

重新启动的日志不放 initState() 和 update() 日志。

Performing hot restart...                                               
Restarted application in 464ms.
flutter: start~~

标签: flutterdart

解决方案


这个问题已经在 Github 上得到解答。

Riverpod 不支持 LocatorMixin。

https://github.com/rrousselGit/river_pod/issues/75#issuecomment-671255330

并建议在文件中注明。

在我看来,LocatorMixin 不需要与 Riverpod 一起使用,因为ProvidierReference

final userRepositoryProvider = Provider((ref) => UserRepository());

final userControllerProvider = StateNotifierProvider((ref) {
  return UserController(
    // Read userRepositoryProvider and create a UserController from the result
    repository: ref.watch(userRepositoryProvider),
  );
});

推荐阅读