मैं यह जानने के लिए एक साधारण टाइमर बनाने की कोशिश कर रहा हूं कि किसी तिथि से वर्तमान तिथि तक कितना समय बीत चुका है

लेकिन मेरे पास समस्या यह है कि टेक्स्ट विजेट केवल एक बार पेंट किया जाता है लेकिन यह अपडेट नहीं होता है, और मैं चाहता हूं कि टेक्स्ट हर 1 सेकंड में अपडेट हो। और पेज को रीफ्रेश नहीं करना है, क्या ऐसा करना संभव है?

import 'package:flutter/material.dart';

class TimerPage extends StatefulWidget {
  @override
  _TimerPageState createState() => _TimerPageState();
}

class _TimerPageState extends State<TimerPage> {
  @override
  Widget build(BuildContext context) {

    final start = DateTime(2020, 8, 10, 16, 30, 0);
    final currentdate= DateTime.now();
    final comparation = currentdate.difference(start);

    return Scaffold(
      body: SafeArea(
        child: Container(
          padding: EdgeInsets.symmetric(vertical: 20),
          child: Center(
              child: Column(
            children: <Widget>[
              Text("Start time: " + start.toString()),
              Divider(),
              Text(
                "time elapsed = " + comparation.toString().substring(0, 7),
                style: TextStyle(color: Color(0xff5abd8c), fontSize: 26),
              )
            ],
          )),
        ),
      ),
    );
  }
}

मैं यह कोशिश करता हूं:

Timer timer;
  final start = DateTime(2020, 8, 17, 21, 30, 0);
  final dateActual = DateTime.now();
  Duration comparation = new Duration(hours: 0, minutes: 0, seconds: 0);
  @override
  void initState() {
    timer = Timer.periodic(Duration(seconds: 1), (_) {
      setState(() {
        comparation = dateActual.difference(start);
        print(comparation);
      });
    });
  }

  @override
  void dispose() {
    timer?.cancel();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Container(
          padding: EdgeInsets.symmetric(vertical: 20),
          child: Center(
              child: Column(
            children: <Widget>[
              Text("Start time: " + start.toString()),
              Divider(),
              Text(
                "time elapsed = " + comparation.toString().substring(0, 7),
                style: TextStyle(color: Color(0xff5abd8c), fontSize: 26),
              )
            ],
          )),
        ),
      ),
    );
  }
}
1
Talked 11 अगस्त 2020, 01:54

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा करने के लिए, आप dart:async लाइब्रेरी से एक Timer चाहते हैं, विशेष रूप से एक Timer.periodic.

अपने StatefulWidget के initState में से एक को तुरंत चालू करें और dispose में इसे रद्द करें।

Timer.periodic एक कॉलबैक लेता है जो प्रत्येक अवधि बीत जाने के बाद सक्रिय होता है। चूंकि आपकी DateTime अंतर गणना पहले से ही build में की जा चुकी है, आपको बस setState के साथ एक पुनर्निर्माण को ट्रिगर करने की आवश्यकता है।

Timer timer;

@override
void initState() {
  timer = Timer.periodic(Duration(seconds: 1), (_) {
    setState(() {});
  });
}

@override
void dispose() {
  timer?.cancel();
}

कम से कम उस Text विजेट का पुनर्निर्माण किए बिना ऐसा करना संभव नहीं है, जिसे बदला जा रहा है। मुझे नहीं लगता कि यह आवश्यक है क्योंकि इस बिल्ड पद्धति में बहुत कुछ नहीं है, लेकिन यदि आप ऐसा करना चाहते हैं, तो आपको सभी आवश्यक समय गणना, टाइमर, और एकल <कोड> निकालना होगा। code>Text विजेट को अपने StatefulWidget पर सेट करें, ताकि केवल एक विजेट जिसे फिर से बनाने की आवश्यकता हो, उसे फिर से बनाया जा सके।

आदर्श रूप से, आपको समय की गणना build पद्धति के बाहर भी करनी चाहिए, लेकिन इस मामले में यह कोई बड़ी बात नहीं है और आपको कुछ ऐसा मिलेगा जो काम करेगा।

1
Christopher Moore 13 अगस्त 2020, 00:50