flutter - 无法调用 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~~
解决方案
这个问题已经在 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),
);
});
推荐阅读
- xcode - Xcode Core Data 彻底崩溃
- object - DOORS 对象删除日期
- python - ModuleNotFoundError:在 AI DevCloud 英特尔中没有名为“keras”的模块
- javascript - 如何存储对象路径
- angularjs - 如何在 html nodejs-->angularjs 中显示响应
- ios - NSUserDefualts 数据在 Preferences 文件夹中重复多次
- android - 改造android中的动态数组解析
- kubernetes - 从 Kubernetes Pod 获取部署注解
- postgresql - 防止影子属性包含在查询中
- android - 使用 Android Studio 获取 Firebase 数据并放入数组