Riverpod 没有改变状态

问题描述

我正在尝试使用 Riverpod 进行 Flutter 阶段管理。

我创建了一个名为 UsuarioProvider 的类:

import 'package:Flutter_riverpod/Flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';

class UsuarioProvider extends StateNotifier<String> {
  UsuarioProvider(): super("No user");

  void cambiarUsuario (String nuevo){

    state = nuevo;
    cambiarEmailUsuarioSP(nuevo);

  }
  cambiarEmailUsuarioSP(String nuevo) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    state =nuevo;
    prefs.setString("email",nuevo);
  }
  recibirEmailSP() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String emailActual = prefs.getString("email");

  }

}

在 main.dart 上,我声明了 Riverpod 提供者的使用如下:

//riverpod USUARIO
    final usuarioProvider = StateNotifierProvider<UsuarioProvider>((ref) {
      return UsuarioProvider();
    });
    void cambiarUsuario(String nueva) {
      context.read(usuarioProvider).cambiarUsuario(nueva);
    }

现在我需要按如下方式更改 UsuarioProvider 的状态:

...
cambiarUsuario(parsed['user']['email'].toString());
...

parsed['user']['email'].toString() = 'mimail@gmail.com' 的值

然后,尝试为其获取状态:

child: Consumer(builder: (_,ScopedReader watch,__) {
                var value = watch(usuarioProvider.state);
                print("%%%%%%%%%%%%%%%%%%EMail en Home:"+value.toString());
                if (value == "No user") {
                  value = 'NoClinic'.tr().toString();
                }
                return Text(
                  value.toString(),style: TextStyle(
                    fontSize: 12.0,),);
              }),

我总是收到“没有用户”,而不是“mimail@gmail.com”

我做错了什么?

解决方法

提供者文件:

import 'package:riverpod/riverpod.dart';

final usuarioProvider = StateNotifierProvider<UsuarioProvider>((ref) {
  return UsuarioProvider();
});

class UsuarioProvider extends StateNotifier<String> {
  UsuarioProvider() : super("No user");

  void cambiarUsuario(String nuevo) {
    state = nuevo;
    cambiarEmailUsuarioSP(nuevo);
  }

  cambiarEmailUsuarioSP(String nuevo) async {
    await Future.delayed(Duration(seconds: 1));
    
    // this isn't necessary and it will case aditional rebuilt
    state = nuevo;
  }
}

屏幕:

class MyConsumerScreen extends StatelessWidget {
  const MyConsumerScreen({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,children: [
            Consumer(
              builder: (context,watch,child) {
                var value = watch(usuarioProvider.state);
                if (value == "No user") {
                  value = 'NoClinic';
                }
                return Text(value);
              },),SizedBox(height: 50),ElevatedButton(
              onPressed: () {
                context.read(usuarioProvider).cambiarUsuario("It work !");
              },child: Text("test"),)
          ],);
  }
}

确保添加提供者范围:

void main() => runApp(ProviderScope(child: MyApp()));