【问题标题】:How to change the app bar title in flutter如何在颤振中更改应用栏标题
【发布时间】:2019-02-19 08:04:38
【问题描述】:
**change the appbar title dynamically**

从数据库中获取 appbar 标题,然后我必须设置为 appbar。我也是 Flutter 的新手,也尝试过 setState。

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

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

【问题讨论】:

    标签: flutter appbar


    【解决方案1】:

    改变

    appBarTitle = val.emailId
    

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

    【讨论】:

    • 嘿,君特!我认为他正在尝试在构建函数中做所有事情,所以在那里调用 setState 可能不起作用。我试着在下面回答。如果我错了,请纠正我
    • 那里并不理想,但我不明白为什么它不起作用。
    • 我的意思是,你是对的,这并不理想,但应该可以。也许问题在于他没有等待对 db Future&lt;User&gt; user = db.getUser(); 的响应,因此用户将始终为 null 并且不会调用 setState,您怎么看?
    • @GünterZöchbauer 在我的代码中进行了更改,添加了 setState 方法仍然无法正常工作,并且在日志中,打印方法被无限次调用
    【解决方案2】:

    你也可以拆分你的代码,假设你的数据库获取是异步的。

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

    【讨论】:

      【解决方案3】:

      您不应该在构建函数中做所有事情。每次调用 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&lt;User&gt; user = db.getUser(); 的结果,因此用户将始终为 null 并且永远不会调用 setState。

      试试Future&lt;User&gt; user = await db.getUser();

      【讨论】:

        【解决方案4】:

        statefulwidget状态类中创建全局变量,命名为appBar Title

        var appBarTitle ="some text";
        

        并为其分配 appBar 标题

        然后用setState方法改变它的值

        【讨论】:

          猜你喜欢
          • 2019-06-07
          • 2021-06-23
          • 2020-03-28
          • 2021-05-02
          • 1970-01-01
          • 2021-09-13
          • 1970-01-01
          • 2020-10-16
          • 2021-06-14
          相关资源
          最近更新 更多