Create by https://gist.github.com/CaiJingLong/a299d15b92edc2d09a8a06cf6dd5a1b0
Last active
April 24, 2020 06:15
-
-
Save CaiJingLong/10f6e4d9b20e415293f0109381134ebd to your computer and use it in GitHub Desktop.
全局loading
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/material.dart'; | |
void main() => runApp(MyApp()); | |
class MyApp extends StatelessWidget { | |
// This widget is the root of your application. | |
@override | |
Widget build(BuildContext context) { | |
return MaterialApp( | |
title: 'Flutter Demo', | |
theme: ThemeData( | |
// This is the theme of your application. | |
// | |
// Try running your application with "flutter run". You'll see the | |
// application has a blue toolbar. Then, without quitting the app, try | |
// changing the primarySwatch below to Colors.green and then invoke | |
// "hot reload" (press "r" in the console where you ran "flutter run", | |
// or simply save your changes to "hot reload" in a Flutter IDE). | |
// Notice that the counter didn't reset back to zero; the application | |
// is not restarted. | |
primarySwatch: Colors.blue, | |
), | |
home: HomePage(), | |
navigatorKey: navigatorKey, | |
); | |
} | |
} | |
class HomePage extends StatefulWidget { | |
@override | |
_HomePageState createState() => _HomePageState(); | |
} | |
class _HomePageState extends State<HomePage> { | |
@override | |
Widget build(BuildContext context) { | |
return Scaffold( | |
appBar: AppBar(), | |
body: Container(), | |
floatingActionButton: FloatingActionButton( | |
onPressed: () { | |
showLoadingDialog(); | |
}, | |
child: Text('.'), | |
), | |
); | |
} | |
} | |
GlobalKey<NavigatorState> navigatorKey = GlobalKey(); | |
NavigatorState get navigator => navigatorKey.currentState; | |
Future<T> showLoadingDialog<T>() { | |
return navigator.push<T>( | |
MyDialogRoute( | |
pageBuilder: (BuildContext context, Animation<double> animation, | |
Animation<double> secondaryAnimation) { | |
return WillPopScope( | |
onWillPop: () async { | |
return false; | |
}, | |
child: Center( | |
child: Column( | |
mainAxisSize: MainAxisSize.min, | |
children: <Widget>[ | |
Center( | |
child: SizedBox( | |
width: 40, | |
height: 40, | |
child: CircularProgressIndicator(), | |
), | |
), | |
RaisedButton( | |
child: Text('close dialog'), | |
onPressed: () { | |
Navigator.pop(context); | |
}, | |
), | |
], | |
), | |
), | |
); | |
}, | |
barrierDismissible: false, | |
), | |
); | |
} | |
class MyDialogRoute<T> extends PopupRoute<T> { | |
MyDialogRoute({ | |
@required RoutePageBuilder pageBuilder, | |
bool barrierDismissible = true, | |
String barrierLabel, | |
Color barrierColor = const Color(0x80000000), | |
Duration transitionDuration = const Duration(milliseconds: 200), | |
RouteTransitionsBuilder transitionBuilder, | |
RouteSettings settings, | |
}) : assert(barrierDismissible != null), | |
_pageBuilder = pageBuilder, | |
_barrierDismissible = barrierDismissible, | |
_barrierLabel = barrierLabel, | |
_barrierColor = barrierColor, | |
_transitionDuration = transitionDuration, | |
_transitionBuilder = transitionBuilder, | |
super(settings: settings); | |
final RoutePageBuilder _pageBuilder; | |
@override | |
bool get barrierDismissible => _barrierDismissible; | |
final bool _barrierDismissible; | |
@override | |
String get barrierLabel => _barrierLabel; | |
final String _barrierLabel; | |
@override | |
Color get barrierColor => _barrierColor; | |
final Color _barrierColor; | |
@override | |
Duration get transitionDuration => _transitionDuration; | |
final Duration _transitionDuration; | |
final RouteTransitionsBuilder _transitionBuilder; | |
@override | |
Widget buildPage(BuildContext context, Animation<double> animation, | |
Animation<double> secondaryAnimation) { | |
return Semantics( | |
child: _pageBuilder(context, animation, secondaryAnimation), | |
scopesRoute: true, | |
explicitChildNodes: true, | |
); | |
} | |
@override | |
Widget buildTransitions(BuildContext context, Animation<double> animation, | |
Animation<double> secondaryAnimation, Widget child) { | |
if (_transitionBuilder == null) { | |
return FadeTransition( | |
opacity: CurvedAnimation( | |
parent: animation, | |
curve: Curves.linear, | |
), | |
child: child); | |
} // Some default transition | |
return _transitionBuilder(context, animation, secondaryAnimation, child); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment