mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

This is not a grand refactor yet, it's just cleaning up what we have already, so that people who keep using this API (e.g. dialogs) have something coherent to deal with. The major changes are that Navigator and NavigatorState have the same API now, that most of the examples use `<void>` instead of `<Null>`, that the navigator observer can see replaces, and that the `settings` is moved from ModalRoute to Route. I also cleaned up some of the API documentation.
77 lines
2.2 KiB
Dart
77 lines
2.2 KiB
Dart
// Copyright 2016 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/foundation.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:url_launcher/url_launcher.dart';
|
|
|
|
typedef Future<String> UpdateUrlFetcher();
|
|
|
|
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() => new 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 &&
|
|
new DateTime.now().difference(_lastUpdateCheck) < const Duration(days: 1)) {
|
|
return null; // We already checked for updates recently
|
|
}
|
|
_lastUpdateCheck = new 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.subhead.copyWith(color: theme.textTheme.caption.color);
|
|
return new AlertDialog(
|
|
title: const Text('Update Flutter Gallery?'),
|
|
content: new Text('A newer version is available.', style: dialogTextStyle),
|
|
actions: <Widget>[
|
|
new FlatButton(
|
|
child: const Text('NO THANKS'),
|
|
onPressed: () {
|
|
Navigator.pop(context, false);
|
|
},
|
|
),
|
|
new FlatButton(
|
|
child: const Text('UPDATE'),
|
|
onPressed: () {
|
|
Navigator.pop(context, true);
|
|
},
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) => widget.child;
|
|
}
|