Riverpod 作为全局变量

Riverpod as global variable

我在我的项目中使用 riverpod,我想使用它是否在小部件之间提供用户 class 的实例。

我的用户状态class:

import 'package:caralgo_mobile_app/models/user.dart';
import 'package:flutter/cupertino.dart';

class UserState extends ChangeNotifier{
  User? _user;

  User? getUser(){
    return _user;
  }

  void setUser(User user){
    _user = user;
  }
}

我写信给 _user 的函数:

void logIn(){
    if(loginFormKey.currentState!.validate()){
      final _user = UserDraft(email: emailTEC.text, password: passwordTEC.text);
      _apiService.post('/signin', _user.toJson()).then((value) {
        scaffoldMessengerKey.currentState!.showSnackBar(SnackBar(content: Text(value!.message)));
        ProviderContainer _container = ProviderContainer();
        _container.read(userProvider).setUser(User.fromJson(value.data['user']));
        _navigatorService.navigateToMainPage();
      }
      );
    }
  }

Class 我想读取用户数据的地方:

class ConfigurationPageViewModel {
  final ApiService _apiService = GetIt.I.get<ApiService>();

  static final ProviderContainer _container = ProviderContainer();

  final registrationFormKey = GlobalKey<FormState>();
  final validator = Validator();
  final emailTEC = TextEditingController(text: _container.read(userProvider).getUser()!.email);
  final nameTEC = TextEditingController(text: _container.read(userProvider).getUser()!.firstName);
  final familyNameTEC = TextEditingController(text: _container.read(userProvider).getUser()!.lastName);
  final passwordTEC = TextEditingController(text: _container.read(userProvider).getUser()!.password);
  var isEnterpriseUser = false;
  final enterpriseNameTEC = TextEditingController(text: _container.read(userProvider).getUser()!.enterprise);
}

我原以为这个解决方案可以工作,但当我打开配置页面时它抛出了一个错误:

Null check operator used on a null value

问题是由于使用了 ProviderContainer。在 riverpod 中,每个提供者都有两个对象:提供者和提供者状态。提供者本身是全球性的,但状态取决于容器。在这种情况下,我无法访问用户数据,因为我使用的每个容器都有单独的状态。 为了解决这个问题,我完全摆脱了 ProviderContainers。 我将 userProvider 直接从消费者小部件传递到:

void logIn(dynamic userProvider){
    if(loginFormKey.currentState!.validate()){
      final _user = UserRegistrationInfo(email: emailTEC.text, password: passwordTEC.text);
      _apiService.post('/signin', _user.toJson()).then((value) {
        scaffoldMessengerKey.currentState!.showSnackBar(SnackBar(content: Text(value!.message)));
        userProvider.setUser(User.fromJson(value.data['user']));
        _navigatorService.navigateToMainPage();
      }
      );
    }
  }

并且所有 TextEditController 都在小部件内初始化:

  @override
  void initState() {
    _configurationPageViewModel.emailTEC.text = ref.read(userProvider).getUser()!.email;
    _configurationPageViewModel.nameTEC.text = ref.read(userProvider).getUser()!.firstName;
    _configurationPageViewModel.familyNameTEC.text = ref.read(userProvider).getUser()!.lastName;
    _configurationPageViewModel.enterpriseCodeTEC.text = ref.read(userProvider).getUser()!.enterprise ?? '';
    _configurationPageViewModel.phoneNumberTEC.text = ref.read(userProvider).getUser()!.phone ?? '';
    super.initState();
  }