A new Flutter project.
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
For help getting started with Flutter development, view the online documentation, which offers tutorials, samples, guidance on mobile development, and a full API reference.
https://github.com/jonataslaw/getx/blob/master/README.zh-cn.md
Flutter iOS风格中Widget内容滑到了顶部导航栏后面与其重叠
用Android开发的方式开发Flutter - 那些开发小技巧
用Android的方式无痛开发Flutter项目,真的是泰裤辣!
在 Flutter 中实现最佳 UX 性能的 12 个图像技巧和最佳实践
FlutterBasic - GetBuilder、Obx、GetX、GetxController 有啥区别
flutter 极简的网络请求 - Retrofit 文档记录
# dart
dart pub run build_runner build
# flutter
flutter pub run build_runner build
// 个人更建议使用 watch 命令
// 该命令监听输入,可以实时编译最新的代码,不用每次修改之后重复使用 build 了
flutter pub run build_runner watch
TabsPage没有使用const进行修饰,结果无法加载页面
/// ^号代表自动加载升级版本的插件,如果需要使用固定版本,可以将^去掉,然后直接写上版本号就可以了
logger: ^1.4.0
所有的插件于2022年8月4日进行了检查,都是此时的最新版本为准.
因为没有指定webview_flutter的版本好,结果空安全检查没有过.
让我同时考虑之前没有编译过的插件,我删除了,应该是版本问题导致,而并非
工程目录下的minSdkVersion设置为19,但是依旧报错.
实际上是Flutter架包下面的flutter.gradle文件中的minSdkVersion为16导致,将其改为高版本就可以解决这个问题.
路径参考:
/Users/dy/.fvm/versions/3.0.1-stable/packages/flutter_tools/gradle/flutter.gradle
class GetBuilderState<T extends GetxController> extends State<GetBuilder<T>>
with GetStateUpdaterMixin {
T? controller;
bool? _isCreator = false;
VoidCallback? _remove;
Object? _filter;
@override
void initState() {
// _GetBuilderState._currentState = this;
super.initState();
widget.initState?.call(this);
var isRegistered = GetInstance().isRegistered<T>(tag: widget.tag);
if (widget.global) {
if (isRegistered) {
if (GetInstance().isPrepared<T>(tag: widget.tag)) {
_isCreator = true;
} else {
_isCreator = false;
}
controller = GetInstance().find<T>(tag: widget.tag);
} else {
controller = widget.init;
_isCreator = true;
GetInstance().put<T>(controller!, tag: widget.tag);
}
} else {
controller = widget.init;
_isCreator = true;
/// 这里调用了onStart
controller?.onStart();
}
if (widget.filter != null) {
_filter = widget.filter!(controller!);
}
_subscribeToController();
}
}
在GetInstance类中
S? _initDependencies<S>({String? name}) {
final key = _getKey(S, name);
final isInit = _singl[key]!.isInit;
S? i;
if (!isInit) {
/// 在这里
i = _startController<S>(tag: name);
if (_singl[key]!.isSingleton!) {
_singl[key]!.isInit = true;
if (Get.smartManagement != SmartManagement.onlyBuilder) {
RouterReportManager.reportDependencyLinkedToRoute(_getKey(S, name));
}
}
}
return i;
}
S _startController<S>({String? tag}) {
final key = _getKey(S, tag);
final i = _singl[key]!.getDependency() as S;
/// 面向协议编程
if (i is GetLifeCycleBase) {
i.onStart();
if (tag == null) {
Get.log('Instance "$S" has been initialized');
} else {
Get.log('Instance "$S" with tag "$tag" has been initialized');
}
if (!_singl[key]!.isSingleton!) {
RouterReportManager.appendRouteByCreate(i);
}
}
return i;
}
controller.onStart => onInit => WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback => on => onReady()
void dispose() {
super.dispose();
widget.dispose?.call(this);
if (_isCreator! || widget.assignId) {
if (widget.autoRemove && GetInstance().isRegistered<T>(tag: widget.tag)) {
GetInstance().delete<T>(tag: widget.tag);
}
}
_remove?.call();
controller = null;
_isCreator = null;
_remove = null;
_filter = null;
}
GetInstance().delete<T>(tag: widget.tag); => onDelete => onClose
flr:
core_version: 3.1.0
dartfmt_line_length: 80
assets:[assets/images]
fonts: []
keyboard_actions:有点像iOS的IQKeyboardManager,但是每个页面的交点都需要自己配置,有点费手 flutter_keyboard_visibility:这个更偏向于监听键盘变化与点击取消响应者,我个人觉得,比起上面费手的,这个更加合理一点
OS Error: Can't assign requested address, errno = 49
这个问题最后flutter/flutter#97489
说aTrust相关,我卸载了真的好了.
最近看了一篇文章FlutterWidget-ThemeData主题-Jinkey,于是上头的把这个App的主题修改功能给补上了.
其实主要是在GetCupertinoApp外层包裹了Obx组件,这样以保证响应式,但是对于底部tabbar颜色的控制,并没有特别好的效果,于是又使用了flutter_phoenix这个库,使得应用可以重启.
看上去功能完美了,但是因为最近一年都没怎么写Flutter,于是乎,写了很久,也改了很久,从文章的这段代码,最后改了完全用enum形式的封装与演化.
切换主题真的没有想象中那么容易,后面考虑一下将我的页面进行简单的国际化吧.
然后我看了一下有关主题修改的官方文档,有点懵圈,因为changeTheme只适配了Material的ThemeData,并没有适配CupertinoThemeData...所以最外层还是用GetMaterialApp为好
改变主题
请不要使用比GetMaterialApp更高级别的widget来更新主题,这可能会造成键重复。很多人习惯于创建一个 "ThemeProvider "的widget来改变应用主题,这在GetX™中是绝对没有必要的。
你可以创建你的自定义主题,并简单地将其添加到Get.changeTheme中,而无需任何模板。
Get.changeTheme(ThemeData.light());
如果你想在 "onTap "中创建类似于改变主题的按钮,你可以结合两个GetX™ API来实现。
检查是否使用了深色的 "Theme "的API,以及 "Theme "更改API。
而Theme Change API,你可以把下面的代码放在onPressed里。
Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark());