首页 文章

如何在flutter中更改应用栏 Headers

提问于
浏览
0
**change the appbar title dynamically**

从数据库获取appbar Headers ,然后我必须设置为appbar . 我也是新手,也尝试了setState .

我已经尝试过setState()但仍然没有工作 . 如何根据服务器响应和数据库值更改appbar文本

import'dart:async';

import'package:flutter / material.dart';
import'package:parking_app / data / database_helper.dart';
import'package:parking_app /模型/ user.dart“;

class HomeScreen扩展StatefulWidget {@override State <StatefulWidget> createState(){
返回新的HomeScreenState(); }}

class HomeScreenState扩展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){
返回;
}
print(TAG“user data:”val.emailId);
setState((){
Build (上下文);
appBarTitle = val.emailId;
});
});
}
返回新的MaterialApp(
home:新脚手架(
appBar:新的AppBar(
title:appBarTitleText,
动作:<Widget> [
//动作按钮
新的IconButton(
图标:新图标(Icons.settings_power),
onPressed :(){
_登出();
},

//动作按钮
]

身体:新填充(
padding:const EdgeInsets.all(16.0),
child:新的ChoiceCard(选择:选项[0]),


); }}

3 回答

  • 0

    您也可以拆分代码,假设您的数据库提取是异步的 .

    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) {
        ...
    
  • 1

    你不应该在构建函数中做所有事情 . 每次调用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;
        });
      });
    

    另外,使用setState()函数包装 appBarTitle = val.emailId;

    编辑:您没有等待dababase Future<User> user = db.getUser(); 的结果,因此用户将始终为null并且从未调用setState .

    试试 Future<User> user = await db.getUser();

  • 1

    更改

    appBarTitle = val.emailId
    

    setState(() {
      appBarTitle = val.emailId;
    });
    

相关问题