【问题标题】:Could not called initState and update (riverpod state_notifier)无法调用 initState 和更新 (riverpod state_notifier)
【发布时间】:2020-07-10 04:38:15
【问题描述】:

问题

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

【问题讨论】:

  • Riverpod 是全新的,还不会广泛使用。你最好在包的github上询问
  • 谢谢。我会在 Github 上提问。
  • StateNotifier 内置于 RiverpodLocatorMixin 不再支持因此您可以在构造函数中初始化或在定义提供程序时进行初始化

标签: flutter dart


【解决方案1】:

这个问题已经在 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),
  );
});

【讨论】:

    猜你喜欢
    • 2021-12-01
    • 2021-01-19
    • 2021-01-19
    • 1970-01-01
    • 2021-12-09
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多