Line data Source code
1 : import 'package:flutter/widgets.dart' 2 : show 3 : BuildContext, 4 : Key, 5 : ModalRoute, 6 : RouteSettings, 7 : State, 8 : StatefulWidget, 9 : Widget; 10 : 11 : /// A simple Widget with a callback useful to set arguments for one SimpleProvider or a StateProvider 12 : /// ```dart 13 : /// PageWithArguments( 14 : /// onReady: (RouteSettings settings) { 15 : /// final arguments = settings.arguments; 16 : /// tabsProvider.setArguments(arguments); 17 : /// }, 18 : /// child: TabsPage(), 19 : /// ); 20 : /// ``` 21 : class PageWithArguments extends StatefulWidget { 22 : // ignore: public_member_api_docs 23 1 : const PageWithArguments({ 24 : Key? key, 25 : required this.onReady, 26 : required this.builder, 27 1 : }) : super(key: key); 28 : 29 : /// callback that must return the widget child of this PageWithArguments 30 : final Widget Function(BuildContext context) builder; 31 : 32 : /// callback that contains the current route `settings`, you can use this callback 33 : /// to get the `arguments` for one route with our rebuild when 34 : /// pushNamedAndRemoveUntil or pushAndRemoveUntil are called. 35 : final void Function(RouteSettings settings) onReady; 36 : 37 1 : @override 38 1 : _PageWithArgumentsState createState() => _PageWithArgumentsState(); 39 : } 40 : 41 : class _PageWithArgumentsState extends State<PageWithArguments> { 42 : bool _ready = false; 43 : 44 1 : @override 45 : void didChangeDependencies() { 46 1 : super.didChangeDependencies(); 47 1 : if (!_ready) { 48 6 : widget.onReady(ModalRoute.of(context)!.settings); 49 1 : _ready = true; 50 : } 51 : } 52 : 53 1 : @override 54 : Widget build(BuildContext context) { 55 3 : return widget.builder(context); 56 : } 57 : } 58 : 59 : /// uses this class to create a page and define the arguments for a SimpleProvider or a StateProvider 60 : /// 61 : /// ``` dart 62 : /// import 'package:flutter/material.dart'; 63 : /// import 'package:flutter_meedu/meedu.dart'; 64 : /// import 'package:flutter_meedu/page.dart'; 65 : /// 66 : /// final loginProvider = SimpleProvider( 67 : /// (ref) => LoginController(ref.arguments), 68 : /// ); 69 : /// 70 : /// class LoginPage extends PageWithArgumentsWidget { 71 : /// const LoginPage({Key? key}) : super(key: key); 72 : /// 73 : /// @override 74 : /// void onInit(RouteSettings settings) { 75 : /// /// you can use settings to get data passed as an argument 76 : /// /// using Navigator.pushName(context,'rpute-name', arguments: data); 77 : /// loginProvider.setArguments(settings.arguments); 78 : /// } 79 : /// 80 : /// @override 81 : /// Widget build(BuildContext context) { 82 : /// return Scaffold( 83 : /// . 84 : /// . 85 : /// . 86 : /// ); 87 : /// } 88 : /// } 89 : /// ``` 90 : abstract class PageWithArgumentsWidget extends StatefulWidget { 91 : // ignore: public_member_api_docs 92 1 : const PageWithArgumentsWidget({ 93 : Key? key, 94 1 : }) : super(key: key); 95 : 96 : /// this method will be called once before render the widget 97 : /// and can be used to get the arguments or settings 98 : /// of the current route 99 : void onInit(RouteSettings settings); 100 : 101 : // ignore: public_member_api_docs 102 : Widget build(BuildContext context); 103 : 104 1 : @override 105 : _PageWithArgumentsWidgetState createState() => 106 1 : _PageWithArgumentsWidgetState(); 107 : } 108 : 109 : class _PageWithArgumentsWidgetState extends State<PageWithArgumentsWidget> { 110 : bool _ready = false; 111 : 112 1 : @override 113 : void didChangeDependencies() { 114 1 : super.didChangeDependencies(); 115 1 : if (!_ready) { 116 5 : widget.onInit(ModalRoute.of(context)!.settings); 117 1 : _ready = true; 118 : } 119 : } 120 : 121 1 : @override 122 : Widget build(BuildContext context) { 123 2 : return widget.build(context); 124 : } 125 : }