mvasco
mvasco

Reputation: 5101

Riverpod not changing state

I am trying to use Riverpod for Flutter stage management.

I have created a class called 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");

  }

}

On main.dart I have declared the use of the riverpod provider as follows:

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

Now I need to change the state for UsuarioProvider as follows:

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

The value for parsed['user']['email'].toString() = '[email protected]'

but then, trying to get the state for it:

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

I am always getting 'No user', not '[email protected]'

What am I doing wrong?

Upvotes: 1

Views: 4312

Answers (1)

Mohammed Alfateh
Mohammed Alfateh

Reputation: 3524

the provider file :

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

The screen :

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

make sure the to add the provider scope :

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

Upvotes: 2

Related Questions