| // Copyright 2014 The Flutter 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/material.dart'; | |
| import 'package:url_launcher/url_launcher.dart'; | |
| typedef UpdateUrlFetcher = Future<String> Function(); | |
| class Updater extends StatefulWidget { | |
| const Updater({ @required this.updateUrlFetcher, this.child, Key key }) | |
| : assert(updateUrlFetcher != null), | |
| super(key: key); | |
| final UpdateUrlFetcher updateUrlFetcher; | |
| final Widget child; | |
| @override | |
| State createState() => UpdaterState(); | |
| } | |
| class UpdaterState extends State<Updater> { | |
| @override | |
| void initState() { | |
| super.initState(); | |
| _checkForUpdates(); | |
| } | |
| static DateTime _lastUpdateCheck; | |
| Future<void> _checkForUpdates() async { | |
| // Only prompt once a day | |
| if (_lastUpdateCheck != null && | |
| DateTime.now().difference(_lastUpdateCheck) < const Duration(days: 1)) { | |
| return; // We already checked for updates recently | |
| } | |
| _lastUpdateCheck = DateTime.now(); | |
| final String updateUrl = await widget.updateUrlFetcher(); | |
| if (updateUrl != null) { | |
| final bool wantsUpdate = await showDialog<bool>(context: context, builder: _buildDialog); | |
| if (wantsUpdate != null && wantsUpdate) | |
| launch(updateUrl); | |
| } | |
| } | |
| Widget _buildDialog(BuildContext context) { | |
| final ThemeData theme = Theme.of(context); | |
| final TextStyle dialogTextStyle = | |
| theme.textTheme.subtitle1.copyWith(color: theme.textTheme.caption.color); | |
| return AlertDialog( | |
| title: const Text('Update Flutter Gallery?'), | |
| content: Text('A newer version is available.', style: dialogTextStyle), | |
| actions: <Widget>[ | |
| FlatButton( | |
| child: const Text('NO THANKS'), | |
| onPressed: () { | |
| Navigator.pop(context, false); | |
| }, | |
| ), | |
| FlatButton( | |
| child: const Text('UPDATE'), | |
| onPressed: () { | |
| Navigator.pop(context, true); | |
| }, | |
| ), | |
| ], | |
| ); | |
| } | |
| @override | |
| Widget build(BuildContext context) => widget.child; | |
| } |