future_widget 0.3.2
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'),
],
);
},
);
}
}