future_widget 0.3.2 copy "future_widget: ^0.3.2" to clipboard
future_widget: ^0.3.2 copied to clipboard

FutureWidget and FutureWidgetWrapper — a pragmatic and clear alternative to FutureBuilder/StreamBuilder

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:future_widget/future_widget.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(),
        body: const Center(
          child: ExampleWidget(),
        ),
      ),
    );
  }
}

Future<int> myFuture4() => Future.delayed(const Duration(seconds: 2), () => 4);

Future<int> myFuture9() => Future.delayed(const Duration(seconds: 2), () => 9);

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

  @override
  State<ExampleWidget> createState() => _ExampleWidgetState();
}

int b = 5;

class _ExampleWidgetState extends State<ExampleWidget> {
  int a = 9;

  @override
  Widget build(BuildContext context) {
    return FutureWidgetWrapper(
      futureGen: FutureGen(() => myFuture4()),
      builder: (context, futureWidgetCtor, isRefreshing, refresh) {
        return Column(
          children: [
            futureWidgetCtor(
              onData: (context, data) {
                return Center(
                  child: Text(
                      'data is: $data${isRefreshing ? '(REFRESHING)' : ''}'),
                );
              },
              onError: (context, error, stackTrace) {
                return Center(
                  child: Text(
                      'error is: $error${isRefreshing ? '(REFRESHING)' : ''}'),
                );
              },
              onLoading: (context, isFirstLoad) {
                return const Center(
                  child: Text('loading'),
                );
              },
            ),
            TextButton(
              onPressed: () {
                refresh(
                  futureGen: () => myFuture9(),
                );
              },
              child:
                  const Text('refresh w/ futureProvider (DATA 9) (initState)'),
            ),
            TextButton(
              onPressed: () {
                refresh();
              },
              child: const Text('refresh w/out futureProvider (initState)'),
            ),
            TextButton(
              onPressed: () {
                refresh(
                  futureGen: () => myFuture9(),
                );
              },
              child:
                  const Text('refresh w/ futureProvider (DATA 9) (lastState)'),
            ),
            TextButton(
              onPressed: () {
                refresh();
              },
              child: const Text('refresh w/out futureProvider (lastState)'),
            ),
            TextButton(
              onPressed: isRefreshing
                  ? null
                  : () {
                      refresh();
                    },
              child: Text(
                isRefreshing
                    ? "button disabled during refresh"
                    : 'refresh w/out futureProvider',
              ),
            ),
            TextButton(
              onPressed: () {
                refresh(
                  disposeState: true,
                );
              },
              child: const Text(
                  'reset (dispose state) (init state)   -   reset shows "loading"'),
            ),
            TextButton(
              onPressed: () {
                refresh(disposeState: true);
              },
              child: const Text(
                  'reset (dispose state) (last state)   -   reset shows "loading"'),
            ),
            TextButton(
              onPressed: () {
                setState(() {
                  a = b++;
                });
              },
              child: const Text('change state outside'),
            ),
            Text('a is: $a'),
          ],
        );
      },
    );
  }
}
0
likes
150
pub points
15%
popularity

Publisher

unverified uploader

FutureWidget and FutureWidgetWrapper — a pragmatic and clear alternative to FutureBuilder/StreamBuilder

Repository (GitLab)
View/report issues

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

flutter, synchronized

More

Packages that depend on future_widget