**change the appbar title dynamically**
データベースからappbarタイトルを取得してから、appbarに設定する必要があります。 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]), ), ), ); } }
データベースのフェッチが非同期であると仮定して、コードを分割することもできます。
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;
});
});
_
また、_appBarTitle = val.emailId;
_をsetState()関数でラップします
編集:dababase Future<User> user = db.getUser();
からの結果を待っていないため、ユーザーは常にnullになり、setStateは呼び出されません。
Future<User> user = await db.getUser();
を試してください
変化する
appBarTitle = val.emailId
に
setState(() {
appBarTitle = val.emailId;
});