Riverpod ProviderListener - 'StateNotifierProvider<Auth, bool>' 不能分配给 'ProviderBase<Object, StateController<bool>>'

问题描述

我正在尝试使用 Riverpod 的 ProviderListener 来监听我的 authProvider 并控制在用户是否获得授权时显示的页面。我收到错误:

错误:无法将参数类型“StateNotifierProvider”分配给参数类型“ProviderBase”。

错误显示在:provider: authProvider,inside the ProviderListener

我想知道是不是因为 StateNotifierProvider 的更新?

我想知道如何更好地使用 ProviderListener,即使有更好的方法来处理授权流程(我非常愿意接受反馈和批评,并且非常感谢任何人可以提供帮助的时间)。我剪掉了不相关的代码

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

class Auth extends StateNotifier<bool> {
  Auth() : super(false);

  void setAuth(bool auth) {
    state = auth;
  }
}

final authProvider = StateNotifierProvider<Auth,bool>((ref) => Auth());

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(
    ProviderScope(
      child: MyApp(),),);
}

class MyApp extends StatefulHookWidget {
  // const MyApp({Key key}) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final Future<FirebaseApp> _fbMyApp = Firebase.initializeApp();

  Widget route = SplashScreen();

  @override
  Widget build(BuildContext context) {
    return ProviderListener<StateController<bool>>(
      provider: authProvider,onChange: (context,auth) {
        if (auth.state = true) {
          route = HomeScreen();
        } else {
          route = SplashScreen();
        }
      },child: MaterialApp(
              home: route,);
  }
}

解决方法

StateController 中删除 ProviderListener,只保留类型(本例中为 bool)

return ProviderListener<bool>(
  provider: authProvider,//this will read the state of your provider (a bool state)
  onChange: (context,auth) {
    if (auth) { //remove setter auth = true,it doesn't make sense to set a value inside an if
      route = HomeScreen();
    } else {
      route = SplashScreen();
    }
  },child: MaterialApp(
          home: route,);

这样您就可以读取 StateNotifier

的状态 ,

我设法通过更改为:

return ProviderListener<StateNotifier<bool>>(
      provider: authProvider.notifier,

它给了我一个不间断的错误: 信息:成员“state”只能在“package:state_notifier/state_notifier.dart”的子类的实例成员中使用。 (invalid_use_of_protected_member)

并且无法正常工作 - 当我使用 context.read 时状态没有被更新

context.read(authProvider.notifier).state = true;

所以它有问题但没有完全坏掉。至少是有进步的。我仍然希望得到帮助和任何人想要提供的反馈!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...