如何在整个应用程序中设置按钮的更新文本值
How to set the updated text value of button throughout the app
我想在整个应用程序中设置按钮的更新文本值,当我单击按钮时,它的文本更改为当前时间,但是当我导航到其他屏幕时,然后返回到我创建的屏幕按钮,它没有显示更新后的文本。
这是我的按钮小部件
String getTime;
//from here i get the current time
void _getTime() {
final String formattedDateTime =
DateFormat('kk:mm:ss a').format(DateTime.now()).toString();
setState(() {
getTime = formattedDateTime;
print("time");
print(getTime);
});
}
String timeInText = "Time in";
Widget _timein() {
//enable- initial case
bool firstCaseFlag = true;
if (getTimeInStatus == false && timeInButtonPressed == true) {
print("i1");
return FlatButton(
color: timeInButtonPressed ? Colors.blue[500] : Colors.blue[200],
textColor: Colors.white,
padding: EdgeInsets.all(15.0),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(buttonRoundRadius)),
child: Row(children: <Widget>[
Icon(
Icons.timer,
),
Expanded(
child: Text(
timeInText,
textAlign: TextAlign.center,
style: TextStyle(fontSize: textFontSize),
),
),
]),
onPressed: () {
_getTime();
setState(() {
if (firstCaseFlag == true) {
timeInText = getTime; //here i set the button text to current time
timeIn = timeInText;
firstCaseFlag = false;
} else {
}
});
calltimeInApi();
});
条件:
在某些情况下按钮会改变那里的状态,比如我有 2 个按钮,即 timein 和 timeout,最初 timein 按钮将启用点击而超时将被禁用,所以如果用户点击 timein 按钮,它的文本会改变当前时间和超时按钮将被启用(这一切都在发生),如果用户移动到其他屏幕并回到主屏幕(我在其中创建了超时和超时按钮),那么当用户点击它时,timein 按钮文本应该显示那个时间.
问题:
我的问题是,当我移动到其他屏幕并回到主屏幕时,timein 按钮已启用,但在我单击它时没有显示时间。
请帮助我如何修复它。
使用 Provider
之类的状态管理来保存值,然后在任何地方访问。
包裹link:https://pub.dev/packages/provider
有用的参考:https://flutter.dev/docs/development/data-and-backend/state-mgmt/intro
我更喜欢使用状态管理StateProvider
。这是一个仅使用 global variable
.
的示例
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:stack_overflow/exports.dart';
String buttonText = "Click to set";
///for riverpod
///final buttonState = StateProvider((ref) => "Click to set");
class BaseWidget extends StatefulWidget {
const BaseWidget({Key? key}) : super(key: key);
@override
_BaseWidgetState createState() => _BaseWidgetState();
}
class _BaseWidgetState extends State<BaseWidget> {
void _getTime() {
final String formattedDateTime =
DateFormat('kk:mm:ss a').format(DateTime.now()).toString();
setState(() {
buttonText = formattedDateTime;
print("time");
print(buttonText);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
ElevatedButton(
onPressed: () {
_getTime();
},
child: Text(buttonText),
),
ElevatedButton(
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => NextWidget(),
));
},
child: Text("next"),
),
],
),
);
}
}
class NextWidget extends StatelessWidget {
const NextWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: ElevatedButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text("Back"),
),
);
}
}
我想在整个应用程序中设置按钮的更新文本值,当我单击按钮时,它的文本更改为当前时间,但是当我导航到其他屏幕时,然后返回到我创建的屏幕按钮,它没有显示更新后的文本。
这是我的按钮小部件
String getTime;
//from here i get the current time
void _getTime() {
final String formattedDateTime =
DateFormat('kk:mm:ss a').format(DateTime.now()).toString();
setState(() {
getTime = formattedDateTime;
print("time");
print(getTime);
});
}
String timeInText = "Time in";
Widget _timein() {
//enable- initial case
bool firstCaseFlag = true;
if (getTimeInStatus == false && timeInButtonPressed == true) {
print("i1");
return FlatButton(
color: timeInButtonPressed ? Colors.blue[500] : Colors.blue[200],
textColor: Colors.white,
padding: EdgeInsets.all(15.0),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(buttonRoundRadius)),
child: Row(children: <Widget>[
Icon(
Icons.timer,
),
Expanded(
child: Text(
timeInText,
textAlign: TextAlign.center,
style: TextStyle(fontSize: textFontSize),
),
),
]),
onPressed: () {
_getTime();
setState(() {
if (firstCaseFlag == true) {
timeInText = getTime; //here i set the button text to current time
timeIn = timeInText;
firstCaseFlag = false;
} else {
}
});
calltimeInApi();
});
条件:
在某些情况下按钮会改变那里的状态,比如我有 2 个按钮,即 timein 和 timeout,最初 timein 按钮将启用点击而超时将被禁用,所以如果用户点击 timein 按钮,它的文本会改变当前时间和超时按钮将被启用(这一切都在发生),如果用户移动到其他屏幕并回到主屏幕(我在其中创建了超时和超时按钮),那么当用户点击它时,timein 按钮文本应该显示那个时间.
问题:
我的问题是,当我移动到其他屏幕并回到主屏幕时,timein 按钮已启用,但在我单击它时没有显示时间。
请帮助我如何修复它。
使用 Provider
之类的状态管理来保存值,然后在任何地方访问。
包裹link:https://pub.dev/packages/provider
有用的参考:https://flutter.dev/docs/development/data-and-backend/state-mgmt/intro
我更喜欢使用状态管理StateProvider
。这是一个仅使用 global variable
.
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:stack_overflow/exports.dart';
String buttonText = "Click to set";
///for riverpod
///final buttonState = StateProvider((ref) => "Click to set");
class BaseWidget extends StatefulWidget {
const BaseWidget({Key? key}) : super(key: key);
@override
_BaseWidgetState createState() => _BaseWidgetState();
}
class _BaseWidgetState extends State<BaseWidget> {
void _getTime() {
final String formattedDateTime =
DateFormat('kk:mm:ss a').format(DateTime.now()).toString();
setState(() {
buttonText = formattedDateTime;
print("time");
print(buttonText);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
ElevatedButton(
onPressed: () {
_getTime();
},
child: Text(buttonText),
),
ElevatedButton(
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => NextWidget(),
));
},
child: Text("next"),
),
],
),
);
}
}
class NextWidget extends StatelessWidget {
const NextWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: ElevatedButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text("Back"),
),
);
}
}