如何在 flutter 中更改应用栏标题
How to change the app bar title in flutter
**change the appbar title dynamically**
正在从数据库中获取应用栏标题,然后我必须设置为应用栏。我也是 flutter 的新手,也尝试过 setState。
我试过 setState() as 但还是不行。
我如何根据服务器响应和数据库值更改应用栏文本
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]),
),
),
); } }
改变
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) {
...
您不应该在构建函数中执行所有操作。每次调用 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;
编辑:您不是在等待数据库的结果Future<User> user = db.getUser();
,因此用户将始终为 null 并且 setState 永远不会被调用。
尝试Future<User> user = await db.getUser();
create global variable name it appBar Title inside statefulwidget
state class
var appBarTitle ="some text";
并为其分配 appBar 标题
然后用setState
方法改变它的值
**change the appbar title dynamically**
正在从数据库中获取应用栏标题,然后我必须设置为应用栏。我也是 flutter 的新手,也尝试过 setState。
我试过 setState() as 但还是不行。 我如何根据服务器响应和数据库值更改应用栏文本
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]), ), ), ); } }
改变
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) {
...
您不应该在构建函数中执行所有操作。每次调用 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;
编辑:您不是在等待数据库的结果Future<User> user = db.getUser();
,因此用户将始终为 null 并且 setState 永远不会被调用。
尝试Future<User> user = await db.getUser();
create global variable name it appBar Title inside statefulwidget
state class
var appBarTitle ="some text";
并为其分配 appBar 标题
然后用setState
方法改变它的值