使用 Riverpod 处理身份验证

2024-05-21

我正在尝试获取 Riverpod,但遇到了一些问题。

我创建了一个用于登录用户的表单,并且尝试在用户登录时更改主视图。 我的问题是,当我设置更改状态并导航回应用程序根目录时,新状态似乎不可用。但是,如果我保存文件或热重新加载应用程序,则新状态可用。

我做错了什么?

我的 main.dart 文件

import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:practical_riverpod/features/authenticated/authentication_state.dart';

import 'package:practical_riverpod/features/signup/signup_screen.dart';

void main() {
  runApp(ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends ConsumerWidget {
  @override
  Widget build(BuildContext context, ScopedReader watch) {
    final auth = watch(authProvider).state;

    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: [
            Text(auth == null ? "not connected" : auth.firstname),
            RaisedButton(
              child: Text("gooooo"),
              onPressed: () {
                Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context) => SignupScreen(),
                  ),
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

我有一个包含状态通知程序的文件:

import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:practical_riverpod/features/models/user_model.dart';

final authProvider = StateNotifierProvider((ref) {
  return AuthNotifier(null);
});

class AuthNotifier extends StateNotifier<UserModel> {
  AuthNotifier(UserModel state) : super(state);

  setCurrentUser(UserModel user) {
    state = user;
  }

  void clearUser() {
    state = null;
  }
}

注册屏幕

import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:practical_riverpod/features/authenticated/authentication_state.dart';
import 'package:practical_riverpod/features/models/user_model.dart';

class SignupScreen extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final _firstnameController =
        useTextEditingController.fromValue(TextEditingValue.empty);

    final _lastname =
        useTextEditingController.fromValue(TextEditingValue.empty);
    final GlobalKey<FormState> _key = GlobalKey<FormState>();

    final auth = context.read(authProvider);

    return Scaffold(
      body: Column(
        children: [
          SizedBox(
            height: 190,
          ),
          Container(
            padding: EdgeInsets.all(20),
            child: Column(
              children: [
                Text("Signup"),
                Form(
                  key: _key,
                  child: Column(
                    children: [
                      TextFormField(
                        decoration: InputDecoration(hintText: "Your email"),
                        controller: _firstnameController,
                        validator: (value) => _firstnameController.text.isEmpty
                            ? "Can't be empty"
                            : null,
                      ),
                      TextFormField(
                        obscureText: true,
                        onSaved: (newValue) => print(newValue),
                        validator: (value) =>
                            _lastname.text.isEmpty ? "Can't be empty" : null,
                        decoration: InputDecoration(
                          hintText: "Password",
                        ),
                        controller: _lastname,
                      ),
                      RaisedButton(
                        child: Text("Create"),
                        onPressed: () {
                          if (_key.currentState.validate()) {
                            auth.setCurrentUser(
                              UserModel(
                                  firstname: _firstnameController.text,
                                  lastname: "_password.text"),
                            );
                            Navigator.of(context).pop();
                          }
                        },
                      )
                    ],
                  ),
                )
              ],
            ),
          )
        ],
      ),
    );
  }
}

最后是我的用户模型:

class UserModel {
  final String firstname;
  final String lastname;

  UserModel({this.firstname, this.lastname});
}

[Riverpod >= 0.14.0] Change:

final auth = watch(authProvider).state;

to:

final auth = watch(authProvider);

[河豆 Change:

final auth = watch(authProvider).state;

to:

final auth = watch(authProvider.state);

我会推荐添加记录器 https://riverpod.dev/docs/concepts/provider_observer#usage-到您的 Riverpod ProviderScope - 在调试此类问题时它确实很有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Riverpod 处理身份验证 的相关文章

随机推荐

  • React无限滚动scrollableTarget动态获取id?

    我在我的项目中使用react infinite scroll component 如何让scrollableTarget动态获取item id 我试过这样scrollableTarget item id 但它不起作用 必须与该 div 具有
  • 使用 OleDbCommandBuilder 时访问 SQL 语法错误

    我要在 C 中使用 OleDbDataAdapter 在 Access 数据库中插入数据 但收到错误消息INSERT INTO 命令中的语法错误 BackgroundWorker worker new BackgroundWorker Ol
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • 用于设置形状颜色的 Google Apps 脚本

    我正在查看 Google Apps 脚本参考here https developers google com apps script reference slides fill setSolidFill Color 并注意到有一种方法set
  • 自定义事件多久才会出现?

    我正在尝试使用 Flurry 将分析跟踪添加到 iPhone 应用程序 我已经连接了 Flurry 并且它似乎可以很好地跟踪会话和使用情况 但是 我刚刚尝试添加自定义事件日志 但每当我查看 Flurry 分析 事件 页面时 它都会告诉我 您
  • jQuery 选择下一个

    我有一个简单的div布局html 有一个函数 当鼠标悬停在className为 personal icon email 的div上时 我将调用JS函数并显示className为 img info mask 的隐藏div div class
  • 使用所有连接的 Flask unittest 和 sqlalchemy

    在进行了大约 100 个单元测试后 我刚刚在 Flask 应用程序上运行单元测试时遇到了问题 所有单元测试都会通过 但是当一次全部运行时 它们将失败并出现以下错误 OperationalError OperationalError FATA
  • 将 Crashlytics 集成到图书馆项目

    我有一个图书馆项目 自定义视图库项目 它没有任何活动 服务 我想将 Crashlytics SDK 集成到我的库中 当我尝试通过 Android Studio 的 Crashlytics 插件 工具栏中的图标 添加它时 它只是停留在 Che
  • Couchdb - 为读者用户提供的蒲团

    我想知道如何阻止读者访问 couchdb 中的 futon utils 只允许管理员访问 我需要这样做 为什么如果读者用户访问蒲团 他可以看到我所有数据库的名称以及有多少文档 我的应用程序应该让读者只有在知道文档 ID 时才能访问文档 引用
  • Eslint 状态已声明 [Vuex]

    我正在运行 ESLint 目前遇到以下 ESLint 错误 错误 状态 已在上部范围无阴影中声明 const state date show false const getters date state gt state date show
  • Python:IndexError:修改代码后列表索引超出范围

    我的代码应该提供以下格式的输出 我尝试修改代码 但我破坏了它 import pandas as pd from bs4 import BeautifulSoup as bs from selenium import webdriver im
  • 应用程序中空指针异常[重复]

    这个问题在这里已经有答案了 我正在尝试在我的应用程序中实施应用程序内计费 我写了这段代码 public class Settings extends PreferenceFragment ServiceConnection mService
  • 从特定 JAR 文件读取资源(文件的重复路径)

    假设您有 jar1 和artifactId 动物园 jar2 和artifactId 动物 两个 jar 都有一个具有相同路径的资源文件 例如 animals animal txt 有什么方法可以从特定的 jar 中读取该文件吗 使用 ge
  • 找不到此可执行文件的有效配置文件...(再次)

    我知道这个问题已经被问过并回答过多次 但我正在抓狂 因为所提出的解决方案似乎都不起作用 尽管有一个有效的配置文件 但据我所知 它与捆绑包标识符匹配 但我收到了上述错误 我已按照本网站上各种建议解决方案中的步骤进行操作 包括删除所有现有证书并
  • Rails 3.2 子域和设计

    我有一个应用程序 用户可以登录到他们的公司子域 我用的是设计 此代码将用户从根域重定向到子域 def after sign in path for resource or scope scope Devise Mapping find sc
  • Weka J48 分类器:无法处理数字类?

    我现在尝试使用 Weka 在我的训练数据上构建 J48 C4 5 分类器模型 首先我这样做 这似乎很顺利 java Xmx10G cp weka weka jar weka core converters TextDirectoryLoad
  • 将 PropertyPlaceholderConfigurer 中的所有属性注入到 bean 中

    我有一个PropertyPlaceholderConfigurer加载多个属性文件 我想通过配置 XML 将合并的属性映射注入到 Spring Bean 中 我可以这样做以及如何做 您只需创建一个属性 bean 并将其用于您的Propert
  • 如果你使用belongs_to而没有相应的has_one,会发生什么?

    我有一个核心模型Item 以及一个从自定义源 例如 RSS feed 填充它的脚本 在 feed 中 每个项目都用一个标识guid 在我的系统中 项目只有一个自动生成的id首要的关键 我想要 比方说 ItemFeedInfo那个地图guid
  • 在服务器上部署 .war 文件(Liferay+Tomcat Bundle)

    我已经准备好我的新 Liferay 网站并尝试在真实环境中测试它 我刚刚在我的服务器上成功安装了 Tomcat Liferay 捆绑包 并根据一些论坛和评论的说明将 war 文件复制到 tomcat 旁边的部署目录中 但访问该 URL 后
  • 使用 Riverpod 处理身份验证

    我正在尝试获取 Riverpod 但遇到了一些问题 我创建了一个用于登录用户的表单 并且尝试在用户登录时更改主视图 我的问题是 当我设置更改状态并导航回应用程序根目录时 新状态似乎不可用 但是 如果我保存文件或热重新加载应用程序 则新状态可