Reputation: 5101
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
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