Flutter 如何在Flatter中更改应用程序栏标题

Flutter 如何在Flatter中更改应用程序栏标题,flutter,appbar,Flutter,Appbar,从数据库中获取appbar标题,然后我必须设置为appbar。我也不熟悉弗利特州 我已尝试将setState()设置为,但仍然不起作用。 如何根据服务器响应和数据库值更改appbar文本 返回新材料app( 家:新脚手架( appBar:新的appBar( 标题:AppBartitletText, 行动:[ //动作按钮 新图标按钮( 图标:新图标(图标、设置和电源), 已按下:(){ _注销(); }, ), //动作按钮 ], ), 车身:新衬垫( 填充:常数边集全部(16.0), 子项:新

从数据库中获取appbar标题,然后我必须设置为appbar。我也不熟悉弗利特州

我已尝试将setState()设置为,但仍然不起作用。 如何根据服务器响应和数据库值更改appbar文本

返回新材料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
method

Hey Günter!我认为他正在尝试在构建函数中执行所有操作,因此在那里调用setState可能不起作用。我尝试在下面回答它。如果我错了,请纠正我。那里不理想,但我不明白为什么不起作用。我的意思是,你是对的,它不理想,但它确实不起作用应该可以。也许问题是他没有等待对db
Future 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";