Как изменить заголовок панели приложения во флаттере - PullRequest
0 голосов
/ 14 сентября 2018
**change the appbar title dynamically**

Получение заголовка панели приложений из базы данных, а затем я должен установить для панели приложений. Я новичок, чтобы трепетать пробовал setState, а также.

Я пробовал setState (), но все еще не работает. Как я могу изменить текст панели приложения на основе ответа сервера, а также значение базы данных

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

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Вы также можете разделить свой код, предполагая, что выборка из вашей базы данных будет асинхронной.

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) {
    ...
0 голосов
/ 14 сентября 2018

Вы не должны делать все в функции сборки.Функция сборки перерисовывается каждый раз, когда вы вызываете setState, поэтому вы запускаете String appBarTitle = "eClerx Parking"; каждый раз, когда она перерисовывается.

Вам необходимо переопределить initState () и поместить туда эту логику

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

Кроме того, оберните appBarTitle = val.emailId; с помощью функции setState ()

EDIT: вы не ожидаете результата от dababase Future<User> user = db.getUser();, поэтому пользователь всегда будет нулевым, а setState никогда не будет вызываться.

Попробуйте Future<User> user = await db.getUser();

0 голосов
/ 14 сентября 2018

Изменить

appBarTitle = val.emailId

на

setState(() {
  appBarTitle = val.emailId;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...