Flutter 如何在Flatter中更改应用程序栏标题
从数据库中获取appbar标题,然后我必须设置为appbar。我也不熟悉弗利特州 我已尝试将setState()设置为,但仍然不起作用。 如何根据服务器响应和数据库值更改appbar文本Flutter 如何在Flatter中更改应用程序栏标题,flutter,appbar,Flutter,Appbar,从数据库中获取appbar标题,然后我必须设置为appbar。我也不熟悉弗利特州 我已尝试将setState()设置为,但仍然不起作用。 如何根据服务器响应和数据库值更改appbar文本 返回新材料app( 家:新脚手架( appBar:新的appBar( 标题:AppBartitletText, 行动:[ //动作按钮 新图标按钮( 图标:新图标(图标、设置和电源), 已按下:(){ _注销(); }, ), //动作按钮 ], ), 车身:新衬垫( 填充:常数边集全部(16.0), 子项:新
返回新材料app(
家:新脚手架(
appBar:新的appBar(
标题:AppBartitletText,
行动:[
//动作按钮
新图标按钮(
图标:新图标(图标、设置和电源),
已按下:(){
_注销();
},
),
//动作按钮
],
),
车身:新衬垫(
填充:常数边集全部(16.0),
子项:新选项卡(选项:选项[0]),
),
),
); } }
改变
到
您还可以拆分代码,假设数据库获取是异步的
setState(() {
appBarTitle = val.emailId;
});
class HomeScreenState扩展状态{
var appBarTitleText=新文本(“eClerx停车”);
Future getUser()异步{
var user=await db.getUser();
如果(用户!=null){
user.then((val){
if(val==null){
返回;
}
打印(“用户数据:+val.emailId”);
设置状态(){
appBarTitleText=Text(val.emailId);
});
});
}
}
@凌驾
void initState(){
super.initState();
getUser();
}
@凌驾
小部件构建(构建上下文){
...
您不应该在build函数中执行所有操作。每次调用setState
时,build函数都会重新绘制,因此每次重新绘制时都会启动String appBarTitle=“eClerx Parking”
您需要重写initState()
,并将此逻辑放在其中
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) {
...
var db=newdatabasehelper();
Future user=db.getUser();
字符串appBarTitle=“eClerx Parking”;
var appBarTitleText=新文本(appBarTitle);
如果(用户!=null){
user.then((val){
if(val==null){
返回;
}
打印(“用户数据:+val.emailId”);
//执行此操作以更新状态并强制重新绘制
设置状态(){
appBarTitle=val.emailId;
});
});
另外,使用setState()函数包装appBarTitle=val.emailId;
编辑:您没有等待来自DABASE的结果Future user=db.getUser();
,因此该用户将始终为null,并且从不调用setState
尝试
Future user=wait db.getUser();
在statefulwidget
state类中创建全局变量名it appBar Title
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;
});
});
并为其指定appBar标题
然后用
setState
methodHey Günter!我认为他正在尝试在构建函数中执行所有操作,因此在那里调用setState可能不起作用。我尝试在下面回答它。如果我错了,请纠正我。那里不理想,但我不明白为什么不起作用。我的意思是,你是对的,它不理想,但它确实不起作用应该可以。也许问题是他没有等待对dbFuture user=db.getUser();
的响应,所以用户将始终为null,不会调用setState,你认为呢?@GünterZöchbauer在我的代码中做了更改,添加的setState方法仍然不起作用,在日志中,print方法被调用了无限次
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]),
),
),
); } }
appBarTitle = val.emailId
setState(() {
appBarTitle = val.emailId;
});
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) {
...
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;
});
});
var appBarTitle ="some text";