패키지, 저장소 및 앱 카테고리 검색

GitHub 저장소the-best-is-best/tbib_downloader

tbib_downloader

the-best-is-best/tbib_downloader open-source repository details.

tbib_downloader 프로젝트 이미지
스타
2
포크
0
최근 푸시(UTC)
2026. 6. 21.
프로젝트 상태
활성

원본 README

아래는 영문 원문 스냅샷입니다. 최신 내용은 GitHub에서 확인하세요.

tbib_downloader

This package for download file and open it you can display notifications and progress notification and can receive download bytes and total bytes

Note this package use awesome notification

  • Can display progress in your app

  • Notification with progress bar

  • Notification downloaded ended

  • ios configuration

step 1

 Change
  BUILD_LIBRARY_FOR_DISTRIBUTION = YES 
 to 
 BUILD_LIBRARY_FOR_DISTRIBUTION = NO  

step 2

  • in info.plist
    <key>LSSupportsOpeningDocumentsInPlace</key>
    <true/>
    <key>UIFileSharingEnabled</key>
    <true/>

Note:

Notification progress bar not support in ios.

  • How to use

step 1

  • init package in main
void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await TBIBDownloader().init();
  ....
}

step 2

  • add awesome notification listener in main page
  @override
  void initState() {
    super.initState();
    AwesomeNotifications().setListeners(
        onActionReceivedMethod: MyNotificationService.onActionReceivedMethod,
        onNotificationCreatedMethod:
            MyNotificationService.onNotificationCreatedMethod,
        onNotificationDisplayedMethod:
            MyNotificationService.onNotificationDisplayedMethod,
        onDismissActionReceivedMethod:
            MyNotificationService.onDismissActionReceivedMethod);
            ...
  }

step 3

  • Create class: MyNotificationService
import 'dart:developer';

import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:tbib_downloader/tbib_downloader.dart';

class MyNotificationService {
  /// Use this method to detect when a new notification or a schedule is created
  @pragma("vm:entry-point")
  static Future<void> onNotificationCreatedMethod(
      ReceivedNotification receivedNotification) async {
    // Your code goes here
  }

  /// Use this method to detect every time that a new notification is displayed
  @pragma("vm:entry-point")
  static Future<void> onNotificationDisplayedMethod(
      ReceivedNotification receivedNotification) async {
    // Your code goes here
  }

  /// Use this method to detect if the user dismissed a notification
  @pragma("vm:entry-point")
  static Future<void> onDismissActionReceivedMethod(
      ReceivedAction receivedAction) async {
    // Your code goes here
  }

  /// Use this method to detect when the user taps on a notification or action button
  @pragma("vm:entry-point")
  static Future<void> onActionReceivedMethod(
      ReceivedAction receivedAction) async {
    if (receivedAction.buttonKeyPressed == 'tbib_downloader_open_file') {
      var res = await TBIBDownloaderOpenFile()
          .openFile(path: receivedAction.payload!['path']!);

      log(res.message);
    } else if (receivedAction.buttonKeyPressed ==
        'tbib_downloader_delete_file') {
      await TBIBDownloaderOpenFile()
          .deleteFile(receivedAction.payload!['path']!);
    }
  }
}

  • how to download

Note

in version 1.0.1 can use attribute saveFileInDataApp to save in android/data/${package name}/...

 ElevatedButton(
                onPressed: () async {
                  var path = await TBIBDownloader().downloadFile(
                    url: 'http://212.183.159.230/50MB.zip',
                    fileName: 'dummy.zip',
                    directoryName: 'test',
                    onReceiveProgress: ({int? receivedBytes, int? totalBytes}) {
                      if (!context.mounted) {
                        return;
                      }
                      setState(() {
                        progress = (receivedBytes! / totalBytes!);
                      });
                    },
                  );
                  debugPrint('path $path');
                  if (!context.mounted) {
                    return;
                  }
                  setState(() {
                    progress = 0;
                  });
                },
                child: const Text('download'),
              ),
  • now more future in download progress

onReceiveProgress use it for get current downloaded and max file size with bytes

  • package support download one file and download file in background

  • if user leave page download will be continue but not support stop download

support open file with native apps

android support

{
            {".3gp",    "video/3gpp"},
            {".torrent","application/x-bittorrent"},
            {".kml",    "application/vnd.google-earth.kml+xml"},
            {".gpx",    "application/gpx+xml"},
            {".csv",    "application/vnd.ms-excel"},
            {".apk",    "application/vnd.android.package-archive"},
            {".asf",    "video/x-ms-asf"},
            {".avi",    "video/x-msvideo"},
            {".bin",    "application/octet-stream"},
            {".bmp",    "image/bmp"},
            {".c",      "text/plain"},
            {".class",  "application/octet-stream"},
            {".conf",   "text/plain"},
            {".cpp",    "text/plain"},
            {".doc",    "application/msword"},
            {".docx",   "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
            {".xls",    "application/vnd.ms-excel"},
            {".xlsx",   "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
            {".exe",    "application/octet-stream"},
            {".gif",    "image/gif"},
            {".gtar",   "application/x-gtar"},
            {".gz",     "application/x-gzip"},
            {".h",      "text/plain"},
            {".htm",    "text/html"},
            {".html",   "text/html"},
            {".jar",    "application/java-archive"},
            {".java",   "text/plain"},
            {".jpeg",   "image/jpeg"},
            {".jpg",    "image/jpeg"},
            {".js",     "application/x-javascript"},
            {".log",    "text/plain"},
            {".m3u",    "audio/x-mpegurl"},
            {".m4a",    "audio/mp4a-latm"},
            {".m4b",    "audio/mp4a-latm"},
            {".m4p",    "audio/mp4a-latm"},
            {".m4u",    "video/vnd.mpegurl"},
            {".m4v",    "video/x-m4v"},
            {".mov",    "video/quicktime"},
            {".mp2",    "audio/x-mpeg"},
            {".mp3",    "audio/x-mpeg"},
            {".mp4",    "video/mp4"},
            {".mpc",    "application/vnd.mpohun.certificate"},
            {".mpe",    "video/mpeg"},
            {".mpeg",   "video/mpeg"},
            {".mpg",    "video/mpeg"},
            {".mpg4",   "video/mp4"},
            {".mpga",   "audio/mpeg"},
            {".msg",    "application/vnd.ms-outlook"},
            {".ogg",    "audio/ogg"},
            {".pdf",    "application/pdf"},
            {".png",    "image/png"},
            {".pps",    "application/vnd.ms-powerpoint"},
            {".ppt",    "application/vnd.ms-powerpoint"},
            {".pptx",   "application/vnd.openxmlformats-officedocument.presentationml.presentation"},
            {".prop",   "text/plain"},
            {".rc",     "text/plain"},
            {".rmvb",   "audio/x-pn-realaudio"},
            {".rtf",    "application/rtf"},
            {".sh",     "text/plain"},
            {".tar",    "application/x-tar"},
            {".tgz",    "application/x-compressed"},
            {".txt",    "text/plain"},
            {".wav",    "audio/x-wav"},
            {".wma",    "audio/x-ms-wma"},
            {".wmv",    "audio/x-ms-wmv"},
            {".wps",    "application/vnd.ms-works"},
            {".xml",    "text/plain"},
            {".z",      "application/x-compress"},
            {".zip",    "application/x-zip-compressed"},
            {"",        "*/*"}
}

ios support

{
  ".rtf": "public.rtf",
  ".txt": "public.plain-text",
  ".html": "public.html",
  ".htm": "public.html",
  ".xml": "public.xml",
  ".tar": "public.tar-archive",
  ".gz": "org.gnu.gnu-zip-archive",
  ".gzip": "org.gnu.gnu-zip-archive",
  ".tgz": "org.gnu.gnu-zip-tar-archive",
  ".jpg": "public.jpeg",
  ".jpeg": "public.jpeg",
  ".png": "public.png",
  ".avi": "public.avi",
  ".mpg": "public.mpeg",
  ".mpeg": "public.mpeg",
  ".mp4": "public.mpeg-4",
  ".3gpp": "public.3gpp",
  ".3gp": "public.3gpp",
  ".mp3": "public.mp3",
  ".zip": "com.pkware.zip-archive",
  ".gif": "com.compuserve.gif",
  ".bmp": "com.microsoft.bmp",
  ".ico": "com.microsoft.ico",
  ".doc": "com.microsoft.word.doc",
  ".xls": "com.microsoft.excel.xls",
  ".ppt": "com.microsoft.powerpoint.​ppt",
  ".wav": "com.microsoft.waveform-​audio",
  ".wm": "com.microsoft.windows-​media-wm",
  ".wmv": "com.microsoft.windows-​media-wmv",
  ".pdf": "com.adobe.pdf"
}

Michelle Raouf GitHub avatar
GitHub 작성자

Michelle Raouf ↗

언어DartKotlinSwiftShellRubyObjective-C

이 저장소가 배포한 패키지

사용 중인 의존성

의존성 목록 13 개

프로젝트에 맞는 저장소를 선택하려면?

사용 목적에 따라 검색하고 개발 활동을 비교한 뒤 원본 저장소에서 요구 사항을 확인하세요.

  1. 이름, 작성자 또는 설명으로 검색하고 기술 주제로 범위를 좁힙니다.
  2. 스타, 포크, 최근 푸시를 함께 비교하세요. 스타는 관심의 지표이며 품질을 보장하지 않습니다.
  3. 사용하기 전에 GitHub에서 README, 라이선스, Issues를 확인하세요.

출처 및 관리

“A repository is the most basic element of GitHub.”

GitHub Docs — About repositories ↗