import 'dart:io'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:path_provider/path_provider.dart'; import 'package:home_framework/utils/http_util.dart'; import 'components/button_util.dart'; class FileDownlaodPage extends StatefulWidget { FileDownlaodPage({Key key}) : super(key: key); @override _FileDownlaodPageState createState() => _FileDownlaodPageState(); } class _FileDownlaodPageState extends State<FileDownlaodPage> { String _downloadPath = 'https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg'; double _downloadRatio = 0.0; String _downloadIndicator = '0.00%'; String _destPath; CancelToken _token; bool _downloading = false; @override void initState() { getTemporaryDirectory() .then((tempDir) => {_destPath = tempDir.path + 'googlechrome.dmg'}); super.initState(); } void _downloadFile() { _token = CancelToken(); _downloading = true; HttpUtil.download(_downloadPath, _destPath, cancelToken: _token, onReceiveProgress: (int received, int total) { if (total != -1) { if (!_token.isCancelled) { setState(() { _downloadRatio = (received / total); if (_downloadRatio == 1) { _downloading = false; } _downloadIndicator = (_downloadRatio * 100).toStringAsFixed(2) + '%'; }); } } else { _downloading = false; EasyLoading.showError('无法获取文件大小,下载失败!'); } }); } void _cancelDownload() { if (_downloadRatio < 1.0) { _token.cancel(); _downloading = false; setState(() { _downloadRatio = 0; _downloadIndicator = '0.00%'; }); } } void _deleteFile() { try { File downloadedFile = File(_destPath); if (downloadedFile.existsSync()) { downloadedFile.delete(); } else { EasyLoading.showError('文件不存在'); } } catch (e) { EasyLoading.showError(e.toString()); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('文件下载', style: Theme.of(context).textTheme.headline4), brightness: Brightness.dark, ), body: Center( child: Container( alignment: Alignment.center, margin: EdgeInsets.all(10), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Row( children: [ Expanded( child: ButtonUtil.primaryTextButton( '下载文件', () { _downloadFile(); }, context, height: 50, ), ), TextButton( child: Text('取消'), onPressed: () { _cancelDownload(); }, ), TextButton( child: Text( '删除', style: TextStyle( color: !_downloading ? Colors.red : Colors.grey), ), onPressed: (!_downloading ? _deleteFile : null), style: ButtonStyle(), ), ], ), Row(children: [ Expanded( child: LinearProgressIndicator( backgroundColor: Colors.grey[600], value: _downloadRatio, ), ), SizedBox( width: 5, ), Text( _downloadIndicator, style: TextStyle(color: Colors.black, fontSize: 12.0), ), ]), ], ), ), ), ); } }
Flutter 通过 Dio 下载文件的使用案例
41 min read