Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter setState依赖于另一个类的值_Flutter_Dart_Flutter Layout - Fatal编程技术网

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)
的小部件才会重新生成。