**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 回答
您也可以拆分代码,假设您的数据库提取是异步的 .
你不应该在构建函数中做所有事情 . 每次调用setState时都会重新绘制构建函数,因此每次重绘时都会启动
String appBarTitle = "eClerx Parking";
.您需要覆盖initState()并将此逻辑放在那里
另外,使用setState()函数包装
appBarTitle = val.emailId;
编辑:您没有等待dababase
Future<User> user = db.getUser();
的结果,因此用户将始终为null并且从未调用setState .试试
Future<User> user = await db.getUser();
更改
至