Как обновить виджет, когда время 23:59:59? - PullRequest
0 голосов
/ 23 апреля 2020

После выполнения события ... Я хочу показать свой Text виджет и изменить этот виджет, когда время в 23:59:59 ... пока я сделал этот код

DateFormat("HH:mm:ss").format(DateTime.now()) =="23:59:59"
                          ? Text("After")
                          : Text("Before")

но проблема в том, что ... когда я закрываю свое приложение и затем снова открываю приложение ... виджет не меняется с Text("Before") на Text("After"), хотя время уже в 23:59:59 .. ... виджет изменяется только после того, как я делаю щелчок по событию и когда приложение все еще открыто ... есть ли способ решить эту проблему без каких-либо дополнительных событий?

1 Ответ

1 голос
/ 23 апреля 2020

У вас есть Text s в build метод. Этот метод работает только при обновлении виджета, например, если состояние изменяется (поэтому виджет обновляется, когда вы do an event click, я думаю, что ваш виджет перестраивается после щелчка). Но виджет ничего не знает о DateTime.now(). Поэтому вы должны поставить DateTime.now в состояние и обновлять его один раз в секунду.

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: SafeArea(
          child: Padding(
            padding: EdgeInsets.all(16),
            child: BeforeAfter(),
          ),
        ),
      ),
    );
  }
}

class BeforeAfter extends StatefulWidget {
  @override
  _BeforeAfterState createState() => _BeforeAfterState();
}

class _BeforeAfterState extends State<BeforeAfter> {
  String time = DateFormat("HH:mm:ss").format(DateTime.now()); // our time which we will update

  @override
  void initState() {
    super.initState();
    updateTime();
  }

  void updateTime() {
    Future.delayed(Duration(seconds: 1), () {
      updateTime();
      setState(() {
        time = DateFormat("HH:mm:ss").format(DateTime.now()); // update time
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(children: <Widget>[
       time == "12:13:00" ? Text("After") : Text("Before"), 
       Text(time)
    ]); // compare time with some value
  }
}

void main() {
  runApp(MyApp());
}

GIF, как это работает

enter image description here

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