当时间是23:59:59时,如何更新Widget?

问题描述 投票:0回答:1

在做完一个活动后,我想显示我的 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...但只有在我做了一个事件点击后,当应用程序仍然打开时,部件才会发生变化...有什么方法可以在没有任何额外事件的情况下解决这个问题吗?

flutter time widget duration
1个回答
1
投票

你有你的 Textbuild 方法。这个方法只在widget的更新时起作用,例如,如果状态发生变化(这就是为什么当你的状态发生变化时,widget会更新。do an event click我想你的widget在点击后会重建)。) 但小部件不知道任何关于 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

© www.soinside.com 2019 - 2024. All rights reserved.