Riverpod 不改变状态

Riverpod not changing state

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

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

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,
                  ),
                );
              }),

我总是得到 'No user',而不是 '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()));