t_widgets 1.2.0 copy "t_widgets: ^1.2.0" to clipboard
t_widgets: ^1.2.0 copied to clipboard

A collection of reusable Flutter custom widgets designed to simplify UI development, speed up prototyping, and enhance cross-platform apps.

TWidget 1.2.0 #

await TWidgets.instance.init(
  // required for TImage,TCoverImage -> default cover path
  defaultImageAssetsPath: 'assets/logo.webp',
  isDebugPrint: true,
  getDarkMode: () => true,
  onDownloadImage: (url, savePath) async {
    //your logic here
    await Dio().download(url, savePath);
  },
  onOpenImageFileChooser:({initialDirectory})async {
    //your file chooser
    return null;
  },
);

// app services
await TAppServices.clearAndRefreshImage();
await TAppServices.copyText('text');
final text = await TAppServices.pasteFromClipboard();

Multi Uploader && Downloader #

// multi uploader
final hostUrl = 'http://10.37.17.103:9000/upload?path=';
showDialog(
  context: context,
  barrierDismissible: false,
  builder: (context) => TMultiUploaderDialog(
    pathList: ['/home/than/Videos/The.Sandman.2025.S02E06.mp4'],
    manager: DioUploadManager(hostUrl: hostUrl),
  ),
);
final urls = [
  'http://10.37.17.103:9000/download?path=/storage/emulated/0/Download/personal_server/Cadmium%20-%20Melody%20(ft.%20Jon%20Becker)%20(Lyrics%20Video).webm',
  'http://10.37.17.103:9000/download?path=/storage/emulated/0/Download/personal_server/Demons%20imagine%20dragons.mp4',
];
// multi downloader
showDialog(
  context: context,
  barrierDismissible: false,
  builder: (context) => TMultiDownloaderDialog(
    manager: DioDownloadManager(savedDir: '/home/than'),
    urls: urls,
    onError: (message) {
      debugPrint(message);
    },
    onSuccess: () {
      debugPrint('success');
    },
  ),
);
//class
class DioUploadManager extends TUploadManager {
  final dio = Dio();
  final cancelToken = CancelToken();
  final String hostUrl;
  final Duration sendTimeout;
  final Duration receiveTimeout;
  DioUploadManager({
    required this.hostUrl,
    this.sendTimeout = const Duration(hours: 1),
    this.receiveTimeout = const Duration(hours: 1),
  });

  @override
  void cancel() {
    cancelToken.cancel('Cancel Upload');
  }

  @override
  Stream<UploadProgress> uploadFiles(List<String> pathList) {
    final controller = StreamController<UploadProgress>();
    int index = 0;

    () async {
      try {
        controller.add(
          UploadProgress(
            index: index,
            total: pathList.length,
            uploaded: 0,
            fileSize: 0,
            status: 'Preparing',
          ),
        );
        for (var path in pathList) {
          index++;
          final name = path.getName();
          final formData = FormData.fromMap({
            'file': await MultipartFile.fromFile(path, filename: name),
          });
          await dio.post(
            hostUrl,
            data: formData,
            cancelToken: cancelToken,
            options: Options(
              contentType: 'multipart/form-data',
              sendTimeout: sendTimeout, // 2GB ဆိုတာကြောင့် timeout ကြီးကြီးထား
              receiveTimeout: receiveTimeout,
            ),
            onSendProgress: (sent, total) {
              controller.add(
                UploadProgress(
                  index: index,
                  total: pathList.length,
                  uploaded: sent.toDouble(),
                  fileSize: total.toDouble(),
                  status: '$name Uploading...',
                ),
              );
            },
          );
        }
        // done
        controller.add(
          UploadProgress(
            index: index,
            total: pathList.length,
            uploaded: 0,
            fileSize: 0,
            status: 'Uploaded',
          ),
        );
      } catch (e) {
        controller.addError(e);
      } finally {
        await controller.close();
      }
    }();

    return controller.stream;
  }
}

class DioDownloadManager extends TDownloadManager {
  final dio = Dio();
  final cancelToken = CancelToken();
  final String savedDir;
  int index = 0;
  DioDownloadManager({required this.savedDir});

  @override
  void cancel() {
    cancelToken.cancel('Download Cancel');
  }

  @override
  Stream<DownloadProgress> downloadFiles(List<String> urls) {
    final streamController = StreamController<DownloadProgress>();

    () async {
      try {
        streamController.add(
          DownloadProgress(
            index: index,
            total: urls.length,
            downloaded: 0,
            fileSize: 0,
            status: 'Preparing...',
          ),
        );

        for (var url in urls) {
          index++;
          final name = url.getName();
          final savePath = '$savedDir/$name';

          await dio.download(
            url,
            savePath,
            cancelToken: cancelToken,
            onReceiveProgress: (count, total) {
              // Stream yield for UI update
              streamController.add(
                DownloadProgress(
                  index: index,
                  total: urls.length,
                  downloaded: count.toDouble(),
                  fileSize: total.toDouble(),
                  status: "`$name` Downloading...",
                ),
              );
            },
          );
        }
        streamController.add(
          DownloadProgress(
            index: index,
            total: urls.length,
            downloaded: 0,
            fileSize: 0,
            status: 'All Downloaded',
          ),
        );
      } catch (e) {
        streamController.addError(e);
      } finally {
        await streamController.close();
      }
    }();
    return streamController.stream;
  }
}

Custom Widgets #

TCacheImage
TChip
TFontListWiget
TImageFile
TImageUrl
TImage
TListTileWithDescWidget
TListTileWithDesc
TLoaderRandom
TLoader
TNumberField
TScaffold
TScrollableColumn
TSearchField
TTextField

Custom Chooser #

TCoverChooser

Custom Dialogs #

TConfirmDialog
TListDialog<T>
TMessageDialog
TRenameDialog
TSortDalog
TAlertDialog

Custom Views #

TSeeAllView<T>
TTagsWrapView

Custom Functions #

getDefaultImageChooser

//dialog function
showTConfirmDialog
showTReanmeDialog
//show menu bottom sheet
showTModalBottomSheet
showTMenuBottomSheet
//dynamic list
showTListDialog<T>
// show message function
showTMessageDialog
showTMessageDialogError
showTSnackBar
showTSnackBarError
//Sorting widget
showTSortDialog

showTAlertDialog

Custom Extensions #

DoubleExtension
FileSystemEntityExtension
StringExtension
TPlatform
TextEditingControllerExtension
0
likes
0
points
500
downloads

Publisher

unverified uploader

Weekly Downloads

A collection of reusable Flutter custom widgets designed to simplify UI development, speed up prototyping, and enhance cross-platform apps.

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

file_selector, flutter, flutter_spinkit, than_pkg

More

Packages that depend on t_widgets