future_widget.dart 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import 'package:flutter/material.dart';
  2. import 'package:twong/utils/index.dart';
  3. class FutureWidget extends StatefulWidget {
  4. final PreferredSize appbar;
  5. final Future<dynamic> Function({dynamic data}) future;
  6. final Widget error;
  7. final Widget loading;
  8. final dynamic data;
  9. final Widget Function(dynamic) bodyBuilder;
  10. FutureWidget(this.future, this.bodyBuilder, {Key key, this.appbar, this.loading, this.error, this.data }): super(key: key);
  11. @override
  12. State<StatefulWidget> createState() {
  13. return _FutureWidgetState();
  14. }
  15. }
  16. class _FutureWidgetState extends State<FutureWidget> {
  17. dynamic _data;
  18. Future _future;
  19. @override
  20. void initState() {
  21. super.initState();
  22. // initData();
  23. _future = widget.future(data: widget.data);
  24. }
  25. initData() async {
  26. var data = await widget.future(data: widget.data);
  27. setState(() {
  28. _data = data;
  29. });
  30. }
  31. @override
  32. Widget build(BuildContext context) {
  33. return FutureBuilder(future: _future, builder: _buildFuture, initialData: {});
  34. }
  35. Widget _buildFuture (BuildContext context, AsyncSnapshot snapshot) {
  36. switch (snapshot.connectionState) {
  37. case ConnectionState.none:
  38. return Center(child: Text("none"));
  39. case ConnectionState.active:
  40. return Center(child: Text("active"));
  41. case ConnectionState.waiting:
  42. return widget.loading == null ? Center(child: CircularProgressIndicator()) : widget.loading;
  43. case ConnectionState.done:
  44. if (snapshot.hasError) {
  45. Log.e("Future Error: ${snapshot.error}");
  46. return widget.loading == null ? Center(child: Text(snapshot.error.toString())) :widget.error;
  47. } else {
  48. return widget.bodyBuilder(snapshot.data);
  49. }
  50. }
  51. return Container();
  52. }
  53. }