概述 高性能的状态管理、智能的依赖注入和便捷的路由管理。
状态管理 Get有两个不同的状态管理器:简单的状态管理器(GetBuilder)和响应式状态管理器(GetX)。
1 2 3 4 5 var name = 'Jonatas Borges' .obs;Obx(() => Text("${controller.name} " ));
GetBuilder 1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Controller extends GetxController { [...] } GetBuilder<Controller>( init: Controller(), builder: (_) => Text( '${Get.find<Controller>().counter} ' , ), ),
唯一的ID 1 2 3 4 5 6 7 8 9 10 11 12 GetBuilder<Controller>( id: 'text' , init: Controller(), builder: (_) => Text( '${Get.find<Controller>().counter} ' , ), ), update(['text' ]); update(['text' ], counter < 10 );
声明响应式变量的方式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 final name = RxString('' );final isLogged = RxBool(false );final count = RxInt(0 );final balance = RxDouble(0.0 );final items = RxList<String >([]);final myMap = RxMap<String , int >({});final name = Rx<String >('' );final isLogged = Rx<Bool>(false );final count = Rx<Int>(0 );final balance = Rx<Double>(0.0 );final number = Rx<Num>(0 )final items = Rx<List <String >>([]);final myMap = Rx<Map <String , int >>({});final name = '' .obs;final isLogged = false .obs;final count = 0. obs;final balance = 0.0 .obs;final number = 0. obs;final items = <String >[].obs;final myMap = <String , int >{}.obs;final user = User().obs;
路由管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 GetMaterialApp( home: MyHome(), ) Get.to(NextScreen()); Get.toNamed('/details' ); Get.offNamed("/NextScreen" ); Get.offAllNamed("/NextScreen" ); Get.toNamed("/NextScreen" , arguments: 'Get is the best' ); Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo" ); print (Get.parameters['id' ]);print (Get.parameters['name' ]);Get.back(); Get.off(NextScreen()); Get.offAll(NextScreen()); var data = await Get.to(Payment());Get.back(result: 'success' );
定义路由 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 void main() { runApp( GetMaterialApp( unknownRoute: GetPage(name: '/notfound' , page: () => UnknownRoutePage()), initialRoute: '/' , getPages: [ GetPage(name: '/' , page: () => MyHomePage()), GetPage(name: '/second' , page: () => Second()), GetPage( name: '/third' , page: () => Third(), transition: Transition.zoom ), ], ) ); }
中间件 嵌套导航 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class AppPages { static const INITIAL = Routes.HOME; static final routes = [ GetPage( name: Routes.HOME, page: () => HomeView(), binding: HomeBinding(), children: [ GetPage( name: Routes.COUNTRY, page: () => CountryView(), children: [ GetPage( name: Routes.DETAILS, page: () => DetailsView(), ), ], ), ]), ]; }
访问导航的时候,可以使用/home/country/details等方式跳转。
依赖管理 添加依赖 Get.put 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 Get.put<S>( S dependency String tag, bool permanent = false , bool overrideAbstract = false , InstanceBuilderCallback<S> builder, ) Get.put<SomeClass>(SomeClass()); Get.put<LoginController>(LoginController(), permanent: true ); Get.put<ListItemController>(ListItemController, tag: "some unique string" );
Get.lazyPut 懒加载一个依赖,这样它只有在使用时才会被实例化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Get.lazyPut<S>( InstanceBuilderCallback builder, String tag, bool fenix = false ) Get.lazyPut<ApiMock>(() => ApiMock()); Get.lazyPut<FirebaseAuth>( () { return FirebaseAuth(); }, tag: Math.random().toString(), fenix: true ) Get.lazyPut<Controller>( () => Controller() )
Get.putAsync 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Get.putAsync<S>( AsyncInstanceBuilderCallback<S> builder, String tag, bool permanent = false ) Get.putAsync<SharedPreferences>(() async { final prefs = await SharedPreferences.getInstance(); await prefs.setInt('counter' , 12345 ); return prefs; }); Get.putAsync<YourAsyncClass>( () async => await YourAsyncClass() )
Get.create 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Get.create<S>( FcBuilderFunc<S> builder, String name, bool permanent = true ) Get.Create<SomeClass>(() => SomeClass()); Get.Create<LoginController>(() => LoginController());
使用 1 2 3 4 5 6 7 8 final controller = Get.find<Controller>();Controller controller = Get.find(); Get.delete<Controller>();
Bindings Bindings使得Get可以知道当使用某个控制器时,哪个页面正在显示,并知道在哪里以及如何销毁它。 此外,Binding类将允许你拥有SmartManager配置控制。你可以配置依赖关系,当从堆栈中删除一个路由时,或者当使用它的widget被布置时,或者两者都不布置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 getPages: [ GetPage( name: '/' , page: () => HomeView(), binding: BindingsBuilder(() { Get.lazyPut<ControllerX>(() => ControllerX()); Get.put<Service>(()=> Api()); }), ), GetPage( name: '/details' , page: () => DetailsView(), binding: BindingsBuilder(() { Get.lazyPut<DetailsController>(() => DetailsController()); }), ), ]; class HomeBinding implements Bindings { @override void dependencies() { Get.lazyPut<HomeController>(() => HomeController()); Get.put<Service>(()=> Api()); } } class DetailsBinding implements Bindings { @override void dependencies() { Get.lazyPut<DetailsController>(() => DetailsController()); } } getPages: [ GetPage( name: '/' , page: () => HomeView(), binding: HomeBinding(), ), GetPage( name: '/details' , page: () => DetailsView(), binding: DetailsBinding(), ), ]; Get.to(Home(), binding: HomeBinding()); Get.to(DetailsView(), binding: DetailsBinding())
智能管理 GetX 默认情况下会将未使用的控制器从内存中移除。 但是如果你想改变GetX控制类的销毁方式,你可以用SmartManagement类设置不同的行为。
1 2 3 4 5 6 7 8 void main () { runApp( GetMaterialApp( smartManagement: SmartManagement.onlyBuilders home: Home(), ) ) }
这是默认的。销毁那些没有被使用的、没有被设置为永久的类。在大多数情况下,你会希望保持这个配置不受影响。如果你是第一次使用GetX,那么不要改变这个配置。
SmartManagement.onlyBuilders
使用该选项,只有在init:中启动的控制器或用Get.lazyPut()加载到Binding中的控制器才会被销毁。
如果你使用Get.put()或Get.putAsync()或任何其他方法,SmartManagement将没有权限移除这个依赖。
在默认行为下,即使是用 “Get.put “实例化的widget也会被移除,这与SmartManagement.onlyBuilders不同。
SmartManagement.keepFactory
就像SmartManagement.full一样,当它不再被使用时,它将删除它的依赖关系,但它将保留它们的工厂,这意味着如果你再次需要该实例,它将重新创建该依赖关系。
国际化 翻译 翻译被保存为一个简单的键值字典映射。 要添加自定义翻译,请创建一个类并扩展翻译
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import 'package:get/get.dart' ;class Messages extends Translations { @override Map <String , Map <String , String >> get keys => { 'zh_CN' : { 'hello' : '你好 世界' , }, 'de_DE' : { 'hello' : 'Hallo Welt' , } }; }
使用翻译 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 return GetMaterialApp( translations: Messages(), locale: Locale('zh' , 'CN' ), fallbackLocale: Locale('en' , 'US' ), ); Text('title' .tr); var locale = Locale('en' , 'US' );Get.updateLocale(locale);
改变主题 1 2 3 Get.changeTheme(ThemeData.light());
其他API 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 Get.arguments Get.previousRoute Get.rawRoute Get.routing Get.isSnackbarOpen Get.isDialogOpen Get.isBottomSheetOpen Get.removeRoute() Get.until() Get.offUntil() Get.offNamedUntil() GetPlatform.isAndroid GetPlatform.isIOS GetPlatform.isMacOS GetPlatform.isWindows GetPlatform.isLinux GetPlatform.isFuchsia GetPlatform.isMobile GetPlatform.isDesktop GetPlatform.isWeb Get.height Get.width Get.context Get.contextOverlay context.width context.height context.heightTransformer() context.widthTransformer() context.mediaQuerySize() context.mediaQueryPadding() context.mediaQueryViewPadding() context.mediaQueryViewInsets() context.orientation() context.isLandscape() context.isPortrait() context.devicePixelRatio() context.textScaleFactor() context.mediaQueryShortestSide() context.showNavbar() context.isPhone() context.isSmallTablet() context.isLargeTablet() context.isTablet() context.responsiveValue<T>()
局部状态组件 GetView 它是一个对已注册的Controller有一个名为controller的getter的const Stateless的Widget
1 2 3 4 5 6 7 8 9 10 11 12 13 14 class AwesomeController extends GetxController { final String title = 'My Awesome View' ; } class AwesomeView extends GetView <AwesomeController > { @override Widget build(BuildContext context) { return Container( padding: EdgeInsets.all(20 ), child: Text( controller.title ), ); } }
GetxService 整个生命周期都存在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 Future<void > main() async { await initServices(); runApp(SomeApp()); } void initServices() async { print ('starting services ...' ); await Get.putAsync(() => DbService().init()); await Get.putAsync(SettingsService()).init(); print ('All services started...' ); } class DbService extends GetxService { Future<DbService> init() async { print ('$runtimeType delays 2 sec' ); await 2. delay(); print ('$runtimeType ready!' ); return this ; } } class SettingsService extends GetxService { void init() async { print ('$runtimeType delays 1 sec' ); await 1. delay(); print ('$runtimeType ready!' ); } }
参考