web-dev-qa-db-fra.com

Comment changer le titre de la barre d'application dans Flutter

**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]),
    ),
  ),
);   } }
6
AKASH WANGALWAR

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) {
    ...
6
Zroq

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();

3
Sebastian

Changement

appBarTitle = val.emailId

à

setState(() {
  appBarTitle = val.emailId;
});
0
Günter Zöchbauer