FilledStacks / FilledStacks/flutter-tutorials

Shared model

Aperta
#146 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Dart
Stelle
4.8k
Fork
1.7k
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

Hi, I have a question, I have this code:

StartUpScreen:

```
class StartUpScreen extends StatelessWidget {
const StartUpScreen({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
var userProvider = context.read();
return ViewModelBuilder.reactive(
viewModelBuilder: () => StartUpViewModel(),
onModelReady: (model) => model.handleStartUpLogic(),
builder: (context, model, child) => Scaffold(
backgroundColor: Colors.white,
body: model.isBusy
? const CircularProgressIndicator()
: model.isLogged
? const HomeScreen()
: LoginScreen()),
);
}
}
```

and relative view model:

```
class StartUpViewModel extends BaseViewModel {
final AuthenticationService _authenticationService = locator();

bool _isLogged = false;
bool get isLogged {
return _isLogged;
}

Future handleStartUpLogic() async {
setBusy(true);
bool hasLoggedInUser = _authenticationService.isUserLoggedIn();
if (hasLoggedInUser) {
_isLogged = true;
setBusy(false);
} else {
_isLogged = false;
setBusy(false);
}
}
}
```

on lunch application I'm not logged and the app show me LoginScreen:

```
class LoginScreen extends StatelessWidget {
LoginScreen({Key? key}) : super(key: key);

final emailController = TextEditingController();
final passwordController = TextEditingController();

@override
Widget build(BuildContext context) {
return ViewModelBuilder.reactive(
viewModelBuilder: () => LoginViewModel(),
builder: (context, model, child) => Scaffold(
backgroundColor: Colors.white,
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 50),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
height: 150,
child: Image.asset('assets/images/title.png'),
),
InputField(
placeholder: 'Email',
controller: emailController,
),
verticalSpaceSmall,
InputField(
placeholder: 'Password',
password: true,
controller: passwordController,
),
verticalSpaceMedium,
Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.end,
children: [
BusyButton(
title: 'Login',
busy: model.isBusy,
onPressed: () {
model.login(
email: emailController.text,
password: passwordController.text,
);
},
)
],
),
verticalSpaceMedium,
],
),
),
),
);
}
}
```

and relative view model:

```
class LoginViewModel extends BaseViewModel {
final AuthenticationService _authenticationService = locator();
final DialogService _dialogService = locator();

Future login({
required String email,
required String password,
}) async {
try {
setBusy(true);
await _authenticationService.loginWithEmail(
email: "myemail",
password: "mypass!",
);
setBusy(false);
} catch (e) {
setBusy(false);
await _dialogService.showDialog(
title: 'Login Failure',
description: 'General login failure. Please try again later',
);
}
}
}

```

The question is, how to change model.isLogged on StartUpViewModel for reload the widget and show the LoginScreen simil to classic provider? I could use navigation but this operation can be useful for other pages as well. for example, in classic provider i've a Page A with total coins, in Page B i add 10 coin, with provider i can update the value with notifyListeners(); without call the server. How to emulate this? it's possible?

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Direzione di ricerca

Inizia leggendo StartUpScreen e StartUpViewModel, quindi confronta il loro utilizzo di ViewModelBuilder con LoginScreen e LoginViewModel. Verifica come reagisce il modello reattivo esistente dopo il login e come l’esempio Provider/notifyListeners rappresenta lo stato condiviso. Il lavoro è completato quando l’issue documenta un approccio coerente per aggiornare i valori condivisi e ricostruire le pagine dipendenti senza navigazione o una chiamata aggiuntiva al server.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
dart, flutter
Ambito
mobile
Tipo di issue
Funzionalità
Difficoltà
5/5
Tempo stimato
Più di una settimana
Stato di attività
Ferma
Chiarezza
Da chiarire
Idoneità per principianti
25/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.