**change the appbar title dynamically**
Obtenir le titre de la barre d'applications à partir de la base de données, puis je dois définir la barre d'applications. Je suis nouveau pour flutter également essayé setState.
J'ai essayé setState () mais ne fonctionne toujours pas. comment puis-je changer le texte de la barre d'application en fonction de la réponse du serveur ainsi que de la valeur de la base de données
import 'Dart:async'; import 'package:flutter/material.Dart'; import 'package:parking_app/data/database_helper.Dart'; import'package:parking_app/models/user.Dart'; class HomeScreen extends StatefulWidget { @override State<StatefulWidget> createState() { return new HomeScreenState(); } } class HomeScreenState extends State<HomeScreen> { @override Widget build(BuildContext context) { var db = new DatabaseHelper(); Future<User> user = db.getUser(); String appBarTitle = "eClerx Parking"; var appBarTitleText = new Text(appBarTitle);
if (user != null) { user.then((val) { if (val == null) { return; } print(TAG+ " user data : " + val.emailId); setState(() { build(context); appBarTitle = val.emailId; }); }); }
return new MaterialApp( home: new Scaffold( appBar: new AppBar( title: appBarTitleText, actions: <Widget>[ // action button new IconButton( icon: new Icon(Icons.settings_power), onPressed: () { _logout(); }, ), // action button ], ), body: new Padding( padding: const EdgeInsets.all(16.0), child: new ChoiceCard(choice: choices[0]), ), ), ); } }
Vous pouvez également fractionner votre code, en supposant que la récupération de votre base de données sera asynchrone.
class HomeScreenState extends State<HomeScreen> {
var appBarTitleText = new Text("eClerx Parking");
Future getUser() async {
var user = await db.getUser();
if (user != null) {
user.then((val) {
if (val == null) {
return;
}
print("user data : " + val.emailId);
setState(() {
appBarTitleText = Text(val.emailId);
});
});
}
}
@override
void initState() {
super.initState();
getUser();
}
@override
Widget build(BuildContext context) {
...
Vous ne devriez pas tout faire dans la fonction de construction. La fonction de construction se redessine à chaque fois que vous appelez setState, vous lancez donc String appBarTitle = "eClerx Parking";
À chaque fois qu'elle se redessine.
Vous devez remplacer l'instState () et y placer cette logique
var db = new DatabaseHelper();
Future<User> user = db.getUser();
String appBarTitle = "eClerx Parking";
var appBarTitleText = new Text(appBarTitle);
if (user != null) {
user.then((val) {
if (val == null) {
return;
}
print("user data : " + val.emailId);
//DO THIS TO UPDATE THE STATE AND FORCE A REDRAW
setState(() {
appBarTitle = val.emailId;
});
});
Enveloppez également appBarTitle = val.emailId;
Avec la fonction setState ()
EDIT: Vous n'attendez pas le résultat de la base de données Future<User> user = db.getUser();
donc l'utilisateur sera toujours nul et setState jamais appelé.
Essayez Future<User> user = await db.getUser();
Changement
appBarTitle = val.emailId
à
setState(() {
appBarTitle = val.emailId;
});