diff --git a/test/lib/unit/flutter_boost_test.dart b/test/lib/unit/flutter_boost_test.dart index 2259a93c20c564eb172443f09b12f2feb80e7a11..3d978c0040c3f6392cf239678597006ae111f69f 100644 --- a/test/lib/unit/flutter_boost_test.dart +++ b/test/lib/unit/flutter_boost_test.dart @@ -1,55 +1,100 @@ +import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_boost/flutter_boost.dart'; -import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'page_widgets.dart'; +import 'package:flutter_boost/container/container_coordinator.dart'; -void main() { - const MethodChannel channel = MethodChannel('flutter_boost'); - final List<MethodCall> log = <MethodCall>[]; - dynamic response; - - channel.setMockMethodCallHandler((MethodCall methodCall) async { - print(methodCall); - log.add(methodCall); - return response; - }); +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => _MyAppState(); +} - tearDown(() { - log.clear(); - }); +class _MyAppState extends State<MyApp> { + @override + void initState() { + super.initState(); + + FlutterBoost.singleton.registerPageBuilders({ + 'embeded': (pageName, params, _) => EmbededFirstRouteWidget(), + 'first': (pageName, params, _) => FirstRouteWidget(), + 'second': (pageName, params, _) => SecondRouteWidget(), + 'tab': (pageName, params, _) => TabRouteWidget(), + 'flutterFragment': (pageName, params, _) => FragmentRouteWidget(params), + 'flutterPage': (pageName, params, _) { + print("flutterPage params:$params"); + + return FlutterRouteWidget(params: params); + }, + }); + FlutterBoost.singleton + .addBoostNavigatorObserver(TestBoostNavigatorObserver()); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Boost example', + builder: FlutterBoost.init(postPush: _onRoutePushed), + home: Container()); + } + + void _onRoutePushed( + String pageName, String uniqueId, Map params, Route route, Future _) {} +} + +class TestBoostNavigatorObserver extends NavigatorObserver { + void didPush(Route<dynamic> route, Route<dynamic> previousRoute) { + print("flutterboost#didPush"); + } + void didPop(Route<dynamic> route, Route<dynamic> previousRoute) { + print("flutterboost#didPop"); + } + + void didRemove(Route<dynamic> route, Route<dynamic> previousRoute) { + print("flutterboost#didRemove"); + } + + void didReplace({Route<dynamic> newRoute, Route<dynamic> oldRoute}) { + print("flutterboost#didReplace"); + } +} + +void main() { TestWidgetsFlutterBinding.ensureInitialized(); - group('flutter_boost', () { - response = null; + testWidgets('test iOS edge swipe then drop back at starting point works', + (WidgetTester tester) async { + //push app + await tester.pumpWidget( + MyApp(), + ); - test('init successfully', () async { - Function builder = FlutterBoost.init(); + //open firt page + ContainerCoordinator.singleton + .nativeContainerDidShow("first", {}, "1000000"); - expect( - builder.runtimeType, - TransitionBuilder, - ); - }); + await tester.pump(const Duration(seconds: 1)); - test('open successfully', () async { - Future<Map<dynamic, dynamic>> result = FlutterBoost.singleton.open("url"); + expect(find.text('First'), findsOneWidget); - expect( - result, - isInstanceOf<Future<Map<dynamic, dynamic>>>(), - ); - }); + //open second page + ContainerCoordinator.singleton + .nativeContainerDidShow("second", {}, "2000000"); + + await tester.pump(const Duration(seconds: 1)); + + expect(find.text('Second'), findsOneWidget); + + await tester.pump(const Duration(seconds: 1)); + + //close sencod page + FlutterBoost.containerManager?.remove("2000000"); + await tester.pump(const Duration(seconds: 1)); -// test('close successfully', () async { -// Future<bool> result = FlutterBoost.singleton.close("id"); -// -// expect( -// result, -// isInstanceOf<bool>(), -// ); -// }); + expect(find.text('First'), findsOneWidget); }); diff --git a/test/lib/unit/page_widgets.dart b/test/lib/unit/page_widgets.dart new file mode 100755 index 0000000000000000000000000000000000000000..a1546a00e89498c76b26f9aa3b08066c8104646e --- /dev/null +++ b/test/lib/unit/page_widgets.dart @@ -0,0 +1,407 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_boost/flutter_boost.dart'; + +class FirstRouteWidget extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('First Route'), + ), + body: Center( + child: + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: + <Widget>[ + RaisedButton( + child: Text('First'), + onPressed: () { + print("open second page!"); + FlutterBoost.singleton.open("second").then((Map value) { + print( + "call me when page is finished. did recieve second route result $value"); + }); + }, + ), + + RaisedButton( + child: Text('Present second route'), + onPressed: () { + print("Present second page!"); + FlutterBoost.singleton.open("second",urlParams:{"present":true}).then((Map value) { + print( + "call me when page is finished. did recieve second route result $value"); + }); + }, + ), + ], + ), + ), + ); + } +} + +class EmbededFirstRouteWidget extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: RaisedButton( + child: Text('Open second route'), + onPressed: () { + print("open second page!"); + FlutterBoost.singleton.open("second").then((Map value) { + print( + "call me when page is finished. did recieve second route result $value"); + }); + }, + ), + ), + ); + } +} + +class SecondRouteWidget extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Second"), + ), + body: Center( + child: RaisedButton( + onPressed: () { + // Navigate back to first route when tapped. + + BoostContainerSettings settings = + BoostContainer.of(context).settings; + FlutterBoost.singleton.close(settings.uniqueId, + result: {"result": "data from second"}); + }, + child: Text('Go back with result!'), + ), + ), + ); + } +} + +class TabRouteWidget extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Tab Route"), + ), + body: Center( + child: RaisedButton( + onPressed: () { + FlutterBoost.singleton.open("second"); + }, + child: Text('Open second route'), + ), + ), + ); + } +} + +class FlutterRouteWidget extends StatefulWidget { + FlutterRouteWidget({this.params,this.message}); + final Map params; + final String message; + + @override + _FlutterRouteWidgetState createState() => _FlutterRouteWidgetState(); +} + +class _FlutterRouteWidgetState extends State<FlutterRouteWidget> { + final TextEditingController _usernameController = TextEditingController(); + + @override + Widget build(BuildContext context) { + final String message=widget.message; + return Scaffold( + appBar: AppBar( + brightness:Brightness.light, + backgroundColor: Colors.white, + textTheme:new TextTheme(title: TextStyle(color: Colors.black)) , + + title: Text('flutter_boost_example'), + ), + body: SingleChildScrollView( + child:Container( + margin: const EdgeInsets.all(24.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: <Widget>[ + Container( + margin: const EdgeInsets.only(top: 10.0,bottom: 20.0), + child: Text( + message ?? "This is a flutter activity \n params:${widget.params}", + style: TextStyle(fontSize: 28.0, color: Colors.blue), + ), + alignment: AlignmentDirectional.center, + ), +// Expanded(child: Container()), + const CupertinoTextField( + prefix: Icon( + CupertinoIcons.person_solid, + color: CupertinoColors.lightBackgroundGray, + size: 28.0, + ), + padding: EdgeInsets.symmetric(horizontal: 6.0, vertical: 12.0), + clearButtonMode: OverlayVisibilityMode.editing, + textCapitalization: TextCapitalization.words, + autocorrect: false, + decoration: BoxDecoration( + border: Border(bottom: BorderSide(width: 0.0, color: CupertinoColors.inactiveGray)), + ), + placeholder: 'Name', + ), + InkWell( + child: Container( + padding: const EdgeInsets.all(8.0), + margin: const EdgeInsets.all(8.0), + color: Colors.yellow, + child: Text( + 'open native page', + style: TextStyle(fontSize: 22.0, color: Colors.black), + )), + + ///åŽé¢çš„å‚数会在nativeçš„IPlatform.startActivity方法回调ä¸æ‹¼æŽ¥åˆ°urlçš„query部分。 + ///例如:sample://nativePage?aaa=bbb + onTap: () => FlutterBoost.singleton + .open("sample://nativePage", urlParams: { + "query": {"aaa": "bbb"} + }), + ), + InkWell( + child: Container( + padding: const EdgeInsets.all(8.0), + margin: const EdgeInsets.all(8.0), + color: Colors.yellow, + child: Text( + 'open first', + style: TextStyle(fontSize: 22.0, color: Colors.black), + )), + + ///åŽé¢çš„å‚数会在nativeçš„IPlatform.startActivity方法回调ä¸æ‹¼æŽ¥åˆ°urlçš„query部分。 + ///例如:sample://nativePage?aaa=bbb + onTap: () => FlutterBoost.singleton + .open("first", urlParams: { + "query": {"aaa": "bbb"} + }), + ), + InkWell( + child: Container( + padding: const EdgeInsets.all(8.0), + margin: const EdgeInsets.all(8.0), + color: Colors.yellow, + child: Text( + 'open second', + style: TextStyle(fontSize: 22.0, color: Colors.black), + )), + + ///åŽé¢çš„å‚数会在nativeçš„IPlatform.startActivity方法回调ä¸æ‹¼æŽ¥åˆ°urlçš„query部分。 + ///例如:sample://nativePage?aaa=bbb + onTap: () => FlutterBoost.singleton + .open("second", urlParams: { + "query": {"aaa": "bbb"} + }), + ), + InkWell( + child: Container( + padding: const EdgeInsets.all(8.0), + margin: const EdgeInsets.all(8.0), + color: Colors.yellow, + child: Text( + 'open tab', + style: TextStyle(fontSize: 22.0, color: Colors.black), + )), + + ///åŽé¢çš„å‚数会在nativeçš„IPlatform.startActivity方法回调ä¸æ‹¼æŽ¥åˆ°urlçš„query部分。 + ///例如:sample://nativePage?aaa=bbb + onTap: () => FlutterBoost.singleton + .open("tab", urlParams: { + "query": {"aaa": "bbb"} + }), + ), + InkWell( + child: Container( + padding: const EdgeInsets.all(8.0), + margin: const EdgeInsets.all(8.0), + color: Colors.yellow, + child: Text( + 'open flutter page', + style: TextStyle(fontSize: 22.0, color: Colors.black), + )), + + ///åŽé¢çš„å‚数会在nativeçš„IPlatform.startActivity方法回调ä¸æ‹¼æŽ¥åˆ°urlçš„query部分。 + ///例如:sample://nativePage?aaa=bbb + onTap: () => FlutterBoost.singleton + .open("sample://flutterPage", urlParams: { + "query": {"aaa": "bbb"} + }), + ), + InkWell( + child: Container( + padding: const EdgeInsets.all(8.0), + margin: const EdgeInsets.all(8.0), + color: Colors.yellow, + child: Text( + 'push flutter widget', + style: TextStyle(fontSize: 22.0, color: Colors.black), + )), + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (_) => PushWidget())); + }, + ), + + InkWell( + child: Container( + padding: const EdgeInsets.all(8.0), + margin: const EdgeInsets.all(8.0), + color: Colors.yellow, + child: Text( + 'push Platform demo', + style: TextStyle(fontSize: 22.0, color: Colors.black), + )), + onTap: () { + }, + ), + InkWell( + child: Container( + padding: const EdgeInsets.all(8.0), + margin: const EdgeInsets.all(8.0), + color: Colors.yellow, + child: Text( + 'open flutter fragment page', + style: TextStyle(fontSize: 22.0, color: Colors.black), + )), + onTap: () => FlutterBoost.singleton + .open("sample://flutterFragmentPage"), + ), + ], + ), + + ), + ), + ); + } +} + +class FragmentRouteWidget extends StatelessWidget { + final Map params; + + FragmentRouteWidget(this.params); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('flutter_boost_example'), + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: <Widget>[ + Container( + margin: const EdgeInsets.only(top: 80.0), + child: Text( + "This is a flutter fragment", + style: TextStyle(fontSize: 28.0, color: Colors.blue), + ), + alignment: AlignmentDirectional.center, + ), + Container( + margin: const EdgeInsets.only(top: 32.0), + child: Text( + params['tag'] ?? '', + style: TextStyle(fontSize: 28.0, color: Colors.red), + ), + alignment: AlignmentDirectional.center, + ), + Expanded(child: Container()), + InkWell( + child: Container( + padding: const EdgeInsets.all(8.0), + margin: const EdgeInsets.all(8.0), + color: Colors.yellow, + child: Text( + 'open native page', + style: TextStyle(fontSize: 22.0, color: Colors.black), + )), + onTap: () => FlutterBoost.singleton.open("sample://nativePage"), + ), + InkWell( + child: Container( + padding: const EdgeInsets.all(8.0), + margin: const EdgeInsets.all(8.0), + color: Colors.yellow, + child: Text( + 'open flutter page', + style: TextStyle(fontSize: 22.0, color: Colors.black), + )), + onTap: () => FlutterBoost.singleton.open("sample://flutterPage"), + ), + InkWell( + child: Container( + padding: const EdgeInsets.all(8.0), + margin: const EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 80.0), + color: Colors.yellow, + child: Text( + 'open flutter fragment page', + style: TextStyle(fontSize: 22.0, color: Colors.black), + )), + onTap: () => + FlutterBoost.singleton.open("sample://flutterFragmentPage"), + ) + ], + ), + ); + } +} + +class PushWidget extends StatefulWidget { + @override + _PushWidgetState createState() => _PushWidgetState(); +} + +class _PushWidgetState extends State<PushWidget> { + VoidCallback _backPressedListenerUnsub; + + @override + void initState() { + // TODO: implement initState + super.initState(); + } + + @override + void didChangeDependencies() { + // TODO: implement didChangeDependencies + super.didChangeDependencies(); + +// if (_backPressedListenerUnsub == null) { +// _backPressedListenerUnsub = +// BoostContainer.of(context).addBackPressedListener(() { +// if (BoostContainer.of(context).onstage && +// ModalRoute.of(context).isCurrent) { +// Navigator.pop(context); +// } +// }); +// } + } + + @override + void dispose() { + // TODO: implement dispose + super.dispose(); + _backPressedListenerUnsub?.call(); + } + + @override + Widget build(BuildContext context) { + return FlutterRouteWidget(message: "Pushed Widget"); + } +}