UploadListCore constructor

const UploadListCore({
  1. Key? key,
  2. required UploadController uploadController,
  3. required UploadsBuilder uploadsBuilder,
  4. required UploadsErrorBuilder uploadsErrorBuilder,
  5. required WidgetBuilder loadingBuilder,
})

A widget to easily display and manage uploads and their current state.

Usage:

class ComposeScreen extends StatefulWidget {
  const ComposeScreen({Key? key}) : super(key: key);

  @override
  State<ComposeScreen> createState() => _ComposeScreenState();
}

class _ComposeScreenState extends State<ComposeScreen> {
  @override
  Widget build(BuildContext context) {
    final uploadController = FeedProvider.of(context).bloc.uploadController;
    return Scaffold(
      appBar: AppBar(title: const Text('Compose'), actions: [
        Padding(
          padding: const EdgeInsets.all(8.0),
          child: ActionChip(
            label: const Text(
              'Post',
              style: TextStyle(
                color: Colors.blue,
              ),
            ),
            backgroundColor: Colors.white,
            onPressed: () {
              final attachments = uploadController.getMediaUris();
              for (var element in attachments) {
                print(element.uri);
              }
              uploadController.clear();
            },
          ),
        )
      ]),
      body: SingleChildScrollView(
        child: Column(
          children: [
            const Padding(
              padding: EdgeInsets.all(8.0),
              child: TextField(
                decoration: InputDecoration(hintText: 'enter a description'),
              ),
            ),
            IconButton(
              onPressed: () async {
                final ImagePicker _picker = ImagePicker();
                final XFile? image =
                    await _picker.pickImage(source: ImageSource.gallery);

                if (image != null) {
                  await uploadController
                      .uploadImage(AttachmentFile(path: image.path));
                } else {
                  // User canceled the picker
                }
              },
              icon: const Icon(Icons.file_copy),
            ),
            UploadListCore(
              uploadController: uploadController,
              loadingBuilder: (context) => CircularProgressIndicator(),
              uploadsErrorBuilder: (error) =>
                  Text('Could not upload error'),
              uploadsBuilder: (context, uploads) {
                return SizedBox(
                  height: 100,
                  child: ListView.builder(
                    scrollDirection: Axis.horizontal,
                    itemCount: uploads.length,
                    itemBuilder: (context, index) => FileUploadStateWidget(
                        fileState: uploads[index],
                        onRemoveUpload: (attachment) {
                          return uploadController.removeUpload(attachment);
                        },
                        onCancelUpload: (attachment) {
                          uploadController.cancelUpload(attachment);
                        },
                        onRetryUpload: (attachment) async {
                          return uploadController.uploadImage(attachment);
                        }),
                  ),
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

Implementation

const UploadListCore({
  Key? key,
  required this.uploadController,
  required this.uploadsBuilder,
  required this.uploadsErrorBuilder,
  required this.loadingBuilder,
}) : super(key: key);