【问题标题】:Riverpod ProviderListener - 'StateNotifierProvider<Auth, bool>' can't be assigned to 'ProviderBase<Object, StateController<bool>>'Riverpod ProviderListener - 'StateNotifierProvider<Auth, bool>' 不能分配给 'ProviderBase<Object, StateController<bool>>'
【发布时间】:2021-06-06 16:01:28
【问题描述】:

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

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

错误显示在:provider: authProvider,在 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,
    );
  }
}

【问题讨论】:

    标签: flutter riverpod flutter-hooks


    【解决方案1】:

    我设法通过更改为:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      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的状态

      【讨论】:

      • 我先试过了。那有错误:错误:没有为“bool”类型定义设置器“状态”。我会认为 state = auth 在 statenotifier 中设置了
      • 我的错,如果它是 == 来评估一个布尔值,在这种情况下 if(auth) 应该足够了
      猜你喜欢
      • 2020-08-23
      • 2021-04-07
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 2021-10-16
      • 2021-10-10
      • 2015-04-25
      相关资源
      最近更新 更多