Flutter setState依赖于另一个类的值
正如我所想,我面临着一个小问题 我想根据另一个类的值显示一个小部件并隐藏它,下面是一个小代码,它将解释我的意思 我使用Flutter setState依赖于另一个类的值,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,正如我所想,我面临着一个小问题 我想根据另一个类的值显示一个小部件并隐藏它,下面是一个小代码,它将解释我的意思 我使用Visibility隐藏和显示helloworld消息 Visibility( visible: showAlert().getAlertVisible(), child: Text( "Hello World" ), ) showAlert().getAlertVisible()我从另一个类中获得了它,它将是true或
Visibility
隐藏和显示helloworld
消息
Visibility(
visible: showAlert().getAlertVisible(),
child: Text(
"Hello World"
),
)
showAlert().getAlertVisible()
我从另一个类中获得了它,它将是true或false
这是类
class showAlert{
bool alertVisible = false;
void setAlertVisible(bool value){
alertVisible = value;
}
bool getAlertVisible(){
return alertVisible;
}
void show(Duration duration){
setAlertVisible(false);
setAlertVisible(true);
Future.delayed(
duration,
(){
setAlertVisible(false);
}
);
}
}
我的问题:当值在
类showart中更改时,由于我没有使用setState()
,所以接口中没有任何更改,当值更改或实时监听时,我如何使用setState()
使用ValueNotifier
和AnimatedBuilder
:
class ShowAlert{
ValueNotifier<bool> alertVisible = ValueNotifier(false);
void show(Duration duration){
alertVisible.value = true;
Future.delayed(duration, ()=> alertVisible.value = false);
}
}
class ShowAlert extends ChangeNotifier{
bool alertVisible = false;
void show(Duration duration) {
alertVisible = true;
notifyListeners();
Future.delayed(duration, () {
alertVisible = false;
notifyListeners();
});
}
}
当ValueNotifier的值更改时,AnimatedBuilder将重建其子级。使用ValueNotifier
和AnimatedBuilder
:
class ShowAlert{
ValueNotifier<bool> alertVisible = ValueNotifier(false);
void show(Duration duration){
alertVisible.value = true;
Future.delayed(duration, ()=> alertVisible.value = false);
}
}
class ShowAlert extends ChangeNotifier{
bool alertVisible = false;
void show(Duration duration) {
alertVisible = true;
notifyListeners();
Future.delayed(duration, () {
alertVisible = false;
notifyListeners();
});
}
}
当ValueNotifier的值更改时,AnimatedBuilder将重建其子级。扩展ChangeNotifier
:
class ShowAlert{
ValueNotifier<bool> alertVisible = ValueNotifier(false);
void show(Duration duration){
alertVisible.value = true;
Future.delayed(duration, ()=> alertVisible.value = false);
}
}
class ShowAlert extends ChangeNotifier{
bool alertVisible = false;
void show(Duration duration) {
alertVisible = true;
notifyListeners();
Future.delayed(duration, () {
alertVisible = false;
notifyListeners();
});
}
}
ChangeNotifier
类实现了Listenable
接口。扩展ChangeNotifier
:
class ShowAlert{
ValueNotifier<bool> alertVisible = ValueNotifier(false);
void show(Duration duration){
alertVisible.value = true;
Future.delayed(duration, ()=> alertVisible.value = false);
}
}
class ShowAlert extends ChangeNotifier{
bool alertVisible = false;
void show(Duration duration) {
alertVisible = true;
notifyListeners();
Future.delayed(duration, () {
alertVisible = false;
notifyListeners();
});
}
}
ChangeNotifier
类实现了Listenable
接口。使用mixin
s:
mixin ShowAlert<T extends StatefulWidget> on State<T> {
bool alertVisible = false;
void show(Duration duration) {
setState(() {
alertVisible = true;
});
Future.delayed(duration, () {
setState(() {
alertVisible = false;
});
});
}
}
mixin ShowAlert开启状态{
bool-alertVisible=false;
无效显示(持续时间){
设置状态(){
alertVisible=true;
});
未来。延迟(持续时间,(){
设置状态(){
alertVisible=false;
});
});
}
}
void main(){
runApp(
材料聚丙烯(
家:脚手架(
正文:MyApp(),
),
),
);
}
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类_MyAppState使用ShowAlert扩展状态{
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
扁平按钮(
已按下:(){
表演(持续时间(秒:5));
},
子项:文本('show'),
),
可见度(
可见:警报可见,
孩子:文本(“你好世界”),
),
],
);
}
}
使用mixin
s:
mixin ShowAlert<T extends StatefulWidget> on State<T> {
bool alertVisible = false;
void show(Duration duration) {
setState(() {
alertVisible = true;
});
Future.delayed(duration, () {
setState(() {
alertVisible = false;
});
});
}
}
mixin ShowAlert开启状态{
bool-alertVisible=false;
无效显示(持续时间){
设置状态(){
alertVisible=true;
});
未来。延迟(持续时间,(){
设置状态(){
alertVisible=false;
});
});
}
}
void main(){
runApp(
材料聚丙烯(
家:脚手架(
正文:MyApp(),
),
),
);
}
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类_MyAppState使用ShowAlert扩展状态{
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
扁平按钮(
已按下:(){
表演(持续时间(秒:5));
},
子项:文本('show'),
),
可见度(
可见:警报可见,
孩子:文本(“你好世界”),
),
],
);
}
}
了解颤振的状态管理。BLoC/Redux/ScopedModelIf如果您需要简单的解决方案,请参见(),我认为提供程序可能是解决此类问题的最佳解决方案,特别是值提供程序。请阅读有关颤振状态管理的信息。BLoC/Redux/ScopedModelIf如果您需要简单的解决方案,请参见(),我认为提供程序可能是解决此类问题的最佳解决方案,特别是值提供程序。我建议使用这种方法,因为它只需要扩展ChangeNotifier
并使用AnimatedBuilder
包装需要重建的零件。我建议使用这种方法,因为它只需要扩展ChangeNotifier
并使用AnimatedBuilder
包装需要重建的零件。谢谢,它现在运行得很好,但我想知道这种方法是最佳实践吗?提升状态或使用带有ChangeNotifier
的控制器是在没有外部包的情况下管理颤振状态的最佳方法。我还尝试了InheritedWidget
和InheritedModel
并制作了继承的\u存储包:当继承的小部件得到重建,只有引用它的子部件才会得到重建。例如,如果您使用Theme.of(context).accentColor
且主题小部件发生更改,则只有调用Theme.of(context)
的小部件才会重新生成。谢谢,它现在运行得很好,但我想知道这种方法是最佳实践吗?提升状态或使用带有ChangeNotifier
的控制器是在没有外部包的情况下管理颤振状态的最佳方法。我还尝试了InheritedWidget
和InheritedModel
并制作了继承的\u存储包:当继承的小部件得到重建,只有引用它的子部件才会得到重建。例如,如果使用Theme.of(context).accentColor
且主题小部件发生更改,则只有调用Theme.of(context)
的小部件才会重新生成。