无法调用initState并更新(riverpod state_notifier)

时间:2020-07-10 04:38:15

标签: flutter dart

问题

我正在使用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~~

1 个答案:

答案 0 :(得分:0)

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

Ripodpod不支持LocatorMixin。

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

建议在文档中予以注明。

我认为,由于ProvidierReference,不需要LocatorMixin与Riverpod一起使用。

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

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