Flutter 不支持 code-push。
在android 只能強制更新apk或者跳轉到谷歌stop去下載。
在ios,只能提醒去 App Store 官網下載。
## 步驟一
- 創(chuàng)建一個 Updater 類味抖。
-? 獲取線上最新的版本號與本地版本號。
-? ? 通過字符串 hashCode 比較版本號是否一致灰粮。
-? ? 如果不一致仔涩,那么彈出更新對話框。
-? ? 更新提醒對話框我們一天彈出一次就好了粘舟。
-? ? 如果用戶點擊更新熔脂,則跳轉到對應的地址。
``` dart
class Updater extends StatefulWidget {
? const Updater({@required this.child, Key key}) : super(key: key);
? final Widget child;
? @override
? State createState() => UpdaterState();
}
class UpdaterState extends State<Updater> {
? @override
? void initState() {
? ? super.initState();
? ? _checkForUpdates();
? }
? Future<void> _checkForUpdates() async {
? ? PackageInfo packageInfo = await PackageInfo.fromPlatform();
? ? String version = packageInfo.version;
? ? String updateUrl = Theme.of(context).platform == TargetPlatform.iOS
? ? ? ? ? updateUrlLs['ios']
? ? ? ? : updateUrlLs['android'];
? ? String updateTime = PreferModel.prefs.getString('updateTime') ?? null;
? ? /// 一天之內只提醒一次需要更新
? ? if (updateTime != null && DateTime.parse(updateTime).day == DateTime.now().day) {
? ? ? return;
? ? }
? ? try {
? ? ? Response response = await Dio().get(updateUrl);
? ? ? String versionShort = response.data['versionShort'];
? ? ? if (version.hashCode != versionShort.hashCode) {
? ? ? ? final bool wantsUpdate = await showDialog<bool>(
? ? ? ? ? context: context,
? ? ? ? ? builder: (BuildContext context) =>
? ? ? ? ? ? ? _buildDialog(context, response.data['update_url'], packageInfo, versionShort),
? ? ? ? ? barrierDismissible: false,
? ? ? ? );
? ? ? ? if (wantsUpdate != null && wantsUpdate) {
? ? ? ? ? PreferModel.prefs.remove('updateTime');
? ? ? ? ? launch(response.data['update_url'],
? ? ? ? ? forceSafariVC: false,
? ? ? ? ? );
? ? ? ? } else {
? ? ? ? ? PreferModel.prefs.setString('updateTime', DateTime.now().toString());
? ? ? ? }
? ? ? }
? ? } catch (e) {}
? }
? Widget _buildDialog(
? ? ? BuildContext context, String updateUrl, PackageInfo packageInfo, String versionShort) {
? ? final ThemeData theme = Theme.of(context);
? ? final TextStyle dialogTextStyle =
? ? ? ? theme.textTheme.subhead.copyWith(color: theme.textTheme.caption.color);
? ? return CupertinoAlertDialog(
? ? ? title: Text('是否立即更新${packageInfo.appName}?'),
? ? ? content: Text('檢測到新版本 v$versionShort', style: dialogTextStyle),
? ? ? actions: <Widget>[
? ? ? ? CupertinoDialogAction(
? ? ? ? ? child: const Text('下次再說'),
? ? ? ? ? onPressed: () {
? ? ? ? ? ? Navigator.pop(context, false);
? ? ? ? ? },
? ? ? ? ),
? ? ? ? CupertinoDialogAction(
? ? ? ? ? child: const Text('立即更新'),
? ? ? ? ? onPressed: () {
? ? ? ? ? ? Navigator.pop(context, true);
? ? ? ? ? },
? ? ? ? ),
? ? ? ],
? ? );
? }
? @override
? Widget build(BuildContext context) => widget.child;
}
```