Digital Clock Made using Flutter with Light and Dark themes
The best way to learn is to do. This app is an example of a digital clock. It has a light theme and a dark theme. This is a great way to sharpen your flutter skills. This flutter project is for beginner level of flutter developers, the ones that are aspiring to be a great flutter developer.
Creating our App
Create a flutter project using the following command:
flutter create anaClock
Dependencies
Add the following dependency in your pubspec.yaml file:
flutter_clock_helper:
path: ../flutter_clock_helper
Code
Inside the lib folder create the following .dart ( main.dart and digital_clock.dart) files and paste the given code:
- main.dart
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter_clock_helper/customizer.dart';
import 'package:flutter_clock_helper/model.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'digital_clock.dart';
void main() {
// A temporary measure until Platform supports web and TargetPlatform supports
// macOS.
if (!kIsWeb && Platform.isMacOS) {
// TODO(gspencergoog): Update this when TargetPlatform includes macOS.
// https://github.com/flutter/flutter/issues/31366
// See https://github.com/flutter/flutter/wiki/Desktop-shells#target-platform-override.
debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
}
// This creates a clock that enables you to customize it.
//
// The [ClockCustomizer] takes in a [ClockBuilder] that consists of:
// - A clock widget (in this case, [DigitalClock])
// - A model (provided to you by [ClockModel])
// For more information, see the flutter_clock_helper package.
//
// Your job is to edit [DigitalClock], or replace it with your
// own clock widget. (Look in digital_clock.dart for more details!)
runApp(ClockCustomizer((ClockModel model) => DigitalClock(model)));
}
- digital_clock.dart
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'package:flutter_clock_helper/model.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
enum _Element {
background,
text,
shadow,
}
final _lightTheme = {
_Element.background: Color(0xFF81B3FE),
_Element.text: Colors.white,
_Element.shadow: Colors.black,
};
final _darkTheme = {
_Element.background: Colors.black,
_Element.text: Colors.white,
_Element.shadow: Color(0xFF174EA6),
};
/// A basic digital clock.
///
/// You can do better than this!
class DigitalClock extends StatefulWidget {
const DigitalClock(this.model);
final ClockModel model;
@override
_DigitalClockState createState() => _DigitalClockState();
}
class _DigitalClockState extends State<DigitalClock> {
DateTime _dateTime = DateTime.now();
Timer _timer;
@override
void initState() {
super.initState();
widget.model.addListener(_updateModel);
_updateTime();
_updateModel();
}
@override
void didUpdateWidget(DigitalClock oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.model != oldWidget.model) {
oldWidget.model.removeListener(_updateModel);
widget.model.addListener(_updateModel);
}
}
@override
void dispose() {
_timer?.cancel();
widget.model.removeListener(_updateModel);
widget.model.dispose();
super.dispose();
}
void _updateModel() {
setState(() {
// Cause the clock to rebuild when the model changes.
});
}
void _updateTime() {
setState(() {
_dateTime = DateTime.now();
// Update once per minute. If you want to update every second, use the
// following code.
_timer = Timer(
Duration(minutes: 1) -
Duration(seconds: _dateTime.second) -
Duration(milliseconds: _dateTime.millisecond),
_updateTime,
);
// Update once per second, but make sure to do it at the beginning of each
// new second, so that the clock is accurate.
// _timer = Timer(
// Duration(seconds: 1) - Duration(milliseconds: _dateTime.millisecond),
// _updateTime,
// );
});
}
@override
Widget build(BuildContext context) {
final colors = Theme.of(context).brightness == Brightness.light
? _lightTheme
: _darkTheme;
final hour =
DateFormat(widget.model.is24HourFormat ? 'HH' : 'hh').format(_dateTime);
final minute = DateFormat('mm').format(_dateTime);
final fontSize = MediaQuery.of(context).size.width / 3.5;
final offset = -fontSize / 7;
final defaultStyle = TextStyle(
color: colors[_Element.text],
fontFamily: 'PressStart2P',
fontSize: fontSize,
shadows: [
Shadow(
blurRadius: 0,
color: colors[_Element.shadow],
offset: Offset(10, 0),
),
],
);
return Container(
color: colors[_Element.background],
child: Center(
child: DefaultTextStyle(
style: defaultStyle,
child: Stack(
children: <Widget>[
Positioned(left: offset, top: 0, child: Text(hour)),
Positioned(right: offset, bottom: offset, child: Text(minute)),
],
),
),
),
);
}
}
Output
The following is the output we obtain from the code above:
- Light Theme
- Dark Theme
Inspired by
Inspired by, Digital Clock Made using Flutter with Light and Dark themes.