setState зависит от значений из другого класса - PullRequest
0 голосов
/ 28 февраля 2020

Я столкнулся с небольшой проблемой, как мне кажется.

Я хочу показать виджет и скрыть его в зависимости от значений из другого класса, вот небольшой код, который объяснит, что я имею в виду.

Я использовал Visibility, чтобы скрыть и показать Hello world сообщение.

Visibility(
   visible: showAlert().getAlertVisible(),
   child: Text(
           "Hello World"
        ),
    )

showAlert().getAlertVisible() Я получил его из другого класса, и это будет true или false.

Это Class

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);
        }
    );
  }
}

Моя проблема: когда значение изменилось в class showAlert ничего не изменилось в интерфейсе, потому что я не использую setState(), Как я могу использовать setState() когда значение меняется или вживую слушает ??

Ответы [ 3 ]

2 голосов
/ 28 февраля 2020

Используйте ValueNotifier и AnimatedBuilder:

class ShowAlert{
  ValueNotifier<bool> alertVisible = ValueNotifier(false);

  void show(Duration duration){
    alertVisible.value = true;
    Future.delayed(duration, ()=> alertVisible.value = false);
  }
}
void main() {
  final showAlert = ShowAlert();
  showAlert.show(Duration(seconds: 5));
  runApp(
    MaterialApp(
      home: Scaffold(
        body: AnimatedBuilder(
          animation: showAlert.alertVisible,
          builder: (context, _) {
            return Visibility(
              visible: showAlert.alertVisible.value,
              child: Text("Hello World"),
            );
          },
        ),
      ),
    ),
  );
}

AnimatedBuilder восстановит свои дочерние элементы при изменении значения ValueNotifier.

0 голосов
/ 28 февраля 2020

Использование mixin с:

mixin ShowAlert<T extends StatefulWidget> on State<T> {
  bool alertVisible = false;

  void show(Duration duration) {
    setState(() {
      alertVisible = true;
    });
    Future.delayed(duration, () {
      setState(() {
        alertVisible = false;
      });
    });
  }
}
void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        body: MyApp(),
      ),
    ),
  );
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with ShowAlert<MyApp> {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        FlatButton(
          onPressed: () {
            show(Duration(seconds: 5));
          },
          child: Text('show'),
        ),
        Visibility(
          visible: alertVisible,
          child: Text("Hello World"),
        ),
      ],
    );
  }
}
0 голосов
/ 28 февраля 2020

Расширение ChangeNotifier:

class ShowAlert extends ChangeNotifier{
  bool alertVisible = false;

  void show(Duration duration) {
    alertVisible = true;
    notifyListeners();

    Future.delayed(duration, () {
      alertVisible = false;
      notifyListeners();
    });
  }
}

void main() {
  final showAlert = ShowAlert();
  showAlert.show(Duration(seconds: 5));
  runApp(
    MaterialApp(
      home: Scaffold(
        body: AnimatedBuilder(
          animation: showAlert,
          builder: (context, _) {
            return Visibility(
              visible: showAlert.alertVisible,
              child: Text("Hello World"),
            );
          },
        ),
      ),
    ),
  );
}

Класс ChangeNotifier реализует интерфейс Listenable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...