本地化
略(建议配合 get_cli 相关命令使用)
更新 locale
var locale = Locale('en', 'US'); Get.updateLocale(locale);
获取系统的 locale
return GetMaterialApp( locale: Get.deviceLocale, );
切换主题
Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark());
GetPage 中间层
示例:
// 设置中间层 GetPage( name: AppRoutes.Main, page: () => MainScreen(), middlewares: [ RouteAuthMiddleware(priority: 1), ], ), // 定义中间层 class RouteAuthMiddleware extends GetMiddleware { RouteAuthMiddleware({required int priority}) : super(priority: priority); @override RouteSettings? redirect(String? route) { var isLogin = SpUtil.getBool("isLogin"); if (isLogin == null || !isLogin) { Future.delayed(Duration(seconds: 1), () => Get.snackbar("提示", "请先登录APP")); return RouteSettings(name: AppRoutes.Login); } else { return null; } } }
日志聚合
GetMaterialApp( enableLog: true, logWriterCallback: localLogWriter, ); void localLogWriter(String text, {bool isError = false}) { // pass the message to your favourite logging package here // please note that even if enableLog: false log messages will be pushed in this callback // you get check the flag if you want through GetConfig.isLogEnable }
.obs 变量的更新
final name = 'GetX'.obs; // only "updates" the stream, if the value is different from the current one. name.value = 'Hey'; // All Rx properties are "callable" and returns the new value. // but this approach does not accepts `null`, the UI will not rebuild. name('Hello'); // is like a getter, prints 'Hello'. name() ; /// numbers: final count = 0.obs; // You can use all non mutable operations from num primitives! count + 1; // Watch out! this is only valid if `count` is not final, but var count += 1; // You can also compare against values: count > 2; /// booleans: final flag = false.obs; // switches the value between true/false flag.toggle(); /// all types: // Sets the `value` to null. flag.nil(); // All toString(), toJson() operations are passed down to the `value` print( count ); // calls `toString()` inside for RxInt final abc = [0,1,2].obs; // Converts the value to a json Array, prints RxList // Json is supported by all Rx types! print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}'); // RxMap, RxList and RxSet are special Rx types, that extends their native types. // but you can work with a List as a regular list, although is reactive! abc.add(12); // pushes 12 to the list, and UPDATES the stream. abc[3]; // like Lists, reads the index 3. // equality works with the Rx and the value, but hashCode is always taken from the value final number = 12.obs; print( number == 12 ); // prints > true /// Custom Rx Models: // toJson(), toString() are deferred to the child, so you can implement override on them, and print() the observable directly. class User { String name, last; int age; User({this.name, this.last, this.age}); @override String toString() => '$name $last, $age years old'; } final user = User(name: 'John', last: 'Doe', age: 33).obs; // `user` is "reactive", but the properties inside ARE NOT! // So, if we change some variable inside of it... user.value.name = 'Roi'; // The widget will not rebuild!, // `Rx` don't have any clue when you change something inside user. // So, for custom classes, we need to manually "notify" the change. user.refresh(); // or we can use the `update()` method! user.update((value){ value.name='Roi'; }); print( user );
GetView
直接注入 controller 实例
class AwesomeController extends GetController { final String title = 'My Awesome View'; } // ALWAYS remember to pass the `Type` you used to register your controller! class AwesomeView extends GetView<AwesomeController> { @override Widget build(BuildContext context) { return Container( padding: EdgeInsets.all(20), child: Text(controller.title), // just call `controller.something` ); } }
GetxService
用于代理 GetxController,并且不会自动销毁。常用于 ApiService
, StorageService
, CacheService 等。仅能通过 Get.reset 删除
Future<void> main() async { await initServices(); /// AWAIT SERVICES INITIALIZATION. runApp(SomeApp()); } /// Is a smart move to make your Services intiialize before you run the Flutter app. /// as you can control the execution flow (maybe you need to load some Theme configuration, /// apiKey, language defined by the User... so load SettingService before running ApiService. /// so GetMaterialApp() doesnt have to rebuild, and takes the values directly. void initServices() async { print('starting services ...'); /// Here is where you put get_storage, hive, shared_pref initialization. /// or moor connection, or whatever that's async. 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!'); } }
2233