Newer
Older
flutterBaseApp / lib / ui / widgets / common / dialog / upgrade_dialog_widget.dart
StephanieGitHub on 9 Feb 2021 10 KB first commit
import 'package:base_app/models/common/version_model.dart';
import 'package:base_app/res/index.dart';
import 'package:base_app/utils/version_util.dart';
import 'package:dio/dio.dart';
import 'package:common_utils/common_utils.dart';
import 'package:flutter/material.dart';

class UpgradeDialog extends StatefulWidget {
  const UpgradeDialog({
    Key key,
    this.versionModel,
    this.appId,
  }) : super(key: key);
  final VersionModel versionModel;
  final String appId;

  @override
  State<StatefulWidget> createState() {
    return _UpgradeDialogState();
  }
}

class _UpgradeDialogState extends State<UpgradeDialog> {
  static const RoundedRectangleBorder _defaultDialogShape =
      RoundedRectangleBorder(
          borderRadius: BorderRadius.all(Radius.circular(4.0)));

  VersionModel versionModel;

  List<String> listContent = List();

  int progress = 0;
  bool isDownload = false;

  OnDownloadProgress progressCallback;

  @override
  void initState() {
    super.initState();
    versionModel = widget.versionModel;

    progressCallback = (int count, int total) {
      progress = ((count / total) * 100).toInt();
//      LogUtil.e(
//          "ProgressCallback count: $count, total: $total, _progress: $progress");
      setState(() {});
      if (progress == 100) {
        Navigator.pop(context);
      }
    };

    VersionUtil().addListener(progressCallback);

//    versionModel.content = "1.基础库升级 | 2.修复OPPO R15详情页问题 | 3.一些优化~";
    if (ObjectUtil.isNotEmpty(versionModel.content))
      listContent = versionModel.content.split(' | ');
  }

  @override
  void dispose() {
    super.dispose();
    VersionUtil().removeListener(progressCallback);
  }

  @override
  Widget build(BuildContext context) {
    return MediaQuery.removeViewInsets(
        removeLeft: true,
        removeTop: true,
        removeRight: true,
        removeBottom: true,
        context: context,
        child: Center(
          child: ConstrainedBox(
            constraints: const BoxConstraints(minWidth: 310.0, maxWidth: 310),
            child: Material(
              color: Colors.white,
              //elevation: _defaultElevation,
              shape: _defaultDialogShape,
              type: MaterialType.card,
              child: isDownload
                  ? Column(
                      mainAxisSize: MainAxisSize.min,
                      crossAxisAlignment: CrossAxisAlignment.stretch,
                      children: <Widget>[
                        Stack(
                          children: <Widget>[
                            Container(
                              width: 310,
                              height: 100,
                              color: Colors.blue,
                            ),
                            Padding(
                              padding: EdgeInsets.all(24),
                              child: Column(
                                mainAxisSize: MainAxisSize.min,
                                crossAxisAlignment: CrossAxisAlignment.start,
                                children: <Widget>[
                                  Text(
                                    'Updating...',
                                    style: TextStyle(
                                        fontSize: 24, color: Colors.white),
                                  ),
                                  Gaps.vGap5,
                                  Text(
                                    versionModel.version,
                                    style: TextStyle(
                                        fontSize: 22, color: Colors.white),
                                  ),
                                ],
                              ),
                            )
                          ],
                        ),
                        Gaps.vGap20,
                        Offstage(
                          offstage: progress >= 0,
                          child: Text(
                            'Network exception, download failed!',
                            textAlign: TextAlign.center,
                            style: TextStyle(
                                fontSize: 14, color: Colors.redAccent),
                          ),
                        ),
                        Offstage(
                          offstage: progress < 0,
                          child: RichText(
                            textAlign: TextAlign.center,
                            text: TextSpan(children: <TextSpan>[
                              TextSpan(
                                  style: TextStyle(
                                      fontSize: 14, color: Colours.text_normal),
                                  text: 'Progress '),
                              TextSpan(
                                  style: TextStyle(
                                      fontSize: 14, color: Colors.blueAccent),
                                  text: "$progress%")
                            ]),
                          ),
                        ),
                        Gaps.vGap25,
                        Container(
                          padding: EdgeInsets.only(left: 24, right: 24),
                          height: 4,
                          child: LinearProgressIndicator(
                            backgroundColor: Colours.green_e5,
                          ),
                        ),
                        Gaps.vGap5,
                        Center(
                          child: FlatButton(
                              onPressed: () {
                                if (progress >= 0) {
                                  Navigator.pop(context);
                                } else {
                                  VersionUtil().downloadApk(
                                      versionModel.url, widget.appId);
                                }
                              },
                              child: Text(
                                progress >= 0 ? 'Background Update' : 'Retry',
                                style: TextStyles.listExtra,
                              )),
                        ),
                        Gaps.vGap5,
                      ],
                    )
                  : Column(
                      mainAxisSize: MainAxisSize.min,
                      crossAxisAlignment: CrossAxisAlignment.stretch,
                      children: <Widget>[
                        Stack(
                          children: <Widget>[
                            Container(
                              color: Colors.blue,
                              width: 310,
                              height: 100,
                            ),
                            Padding(
                              padding: EdgeInsets.all(24),
                              child: Column(
                                mainAxisSize: MainAxisSize.min,
                                crossAxisAlignment: CrossAxisAlignment.start,
                                children: <Widget>[
                                  Text(
                                    'New Version',
                                    style: TextStyle(
                                        fontSize: 24, color: Colors.white),
                                  ),
                                  Gaps.vGap5,
                                  Text(
                                    versionModel.version,
                                    style: TextStyle(
                                        fontSize: 22, color: Colors.white),
                                  ),
                                ],
                              ),
                            )
                          ],
                        ),
                        Padding(
                          padding: EdgeInsets.only(left: 24, top: 12),
                          child: Text(
                            'Update Content',
                            style: TextStyles.listTitle,
                          ),
                        ),
                        Gaps.vGap15,
                        ListView.builder(
                            padding: EdgeInsets.only(left: 24, right: 24),
                            shrinkWrap: true,
                            physics: ClampingScrollPhysics(),
                            addRepaintBoundaries: false,
                            itemCount: listContent.length,
                            itemBuilder: (BuildContext context, int index) {
                              return Padding(
                                padding: EdgeInsets.only(top: 5, bottom: 5),
                                child: Text(
                                  listContent[index],
                                  style: TextStyles.listContent,
                                ),
                              );
                            }),
                        Gaps.vGap10,
                        Row(
                          children: <Widget>[
                            Gaps.hGap10,
                            Expanded(
                                child: FlatButton(
                                    onPressed: () {
                                      Navigator.pop(context);
                                    },
                                    child: Text(
                                      'Next',
                                      style: TextStyles.listExtra,
                                    ))),
                            Gaps.hGap5,
                            Expanded(
                                child: FlatButton(
                                    onPressed: () {
                                      VersionUtil().downloadApk(
                                          versionModel.url, widget.appId);
                                      setState(() {
                                        isDownload = true;
                                      });
                                    },
                                    child: Text(
                                      'Now',
                                      style: TextStyles.listExtra2,
                                    ))),
                            Gaps.hGap10,
                          ],
                        ),
                      ],
                    ),
            ),
          ),
        ));
  }
}