Skip to content

Latest commit

 

History

History
261 lines (187 loc) · 8.28 KB

说明.md

File metadata and controls

261 lines (187 loc) · 8.28 KB

getx_study

A new Flutter project.

Getting Started

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 GetX使用---简洁的魅力!

Flutter应用框架搭建(一)GetX集成及使用详解

Flutter iOS风格中Widget内容滑到了顶部导航栏后面与其重叠

CupertinoIcons图标示例

flr自动化集成

写给flutter开发者的vscode快捷键、插件和设置

用Android开发的方式开发Flutter - 那些开发小技巧

用Android的方式无痛开发Flutter项目,真的是泰裤辣!

Flutter 响应式状态管理框架GetX

基于Getx的Flutter应用架构

GetX的进阶使用

在 Flutter 中实现最佳 UX 性能的 12 个图像技巧和最佳实践

FlutterBasic - GetBuilder、Obx、GetX、GetxController 有啥区别

FlutterBasic - 检测没import导入的包

Dio+Retrofit

flutter 极简的网络请求 - Retrofit 文档记录

# dart
dart pub run build_runner build

# flutter	
flutter pub run build_runner build

// 个人更建议使用 watch 命令
// 该命令监听输入,可以实时编译最新的代码,不用每次修改之后重复使用 build 了
flutter pub run build_runner watch

没有使用const页面无法加载

TabsPage没有使用const进行修饰,结果无法加载页面

.yaml中^的意思

/// ^号代表自动加载升级版本的插件,如果需要使用固定版本,可以将^去掉,然后直接写上版本号就可以了
logger: ^1.4.0

pubspec.yaml

所有的插件于2022年8月4日进行了检查,都是此时的最新版本为准.

因为没有指定webview_flutter的版本好,结果空安全检查没有过.

让我同时考虑之前没有编译过的插件,我删除了,应该是版本问题导致,而并非

Error: uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared

工程目录下的minSdkVersion设置为19,但是依旧报错.

实际上是Flutter架包下面的flutter.gradle文件中的minSdkVersion为16导致,将其改为高版本就可以解决这个问题.

路径参考:

/Users/dy/.fvm/versions/3.0.1-stable/packages/flutter_tools/gradle/flutter.gradle

关于GetxController的生命周期调用的时机

onStart

情况一:

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()

onDelete

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的使用

flr:
  core_version: 3.1.0
  dartfmt_line_length: 80
  assets:[assets/images]
  fonts: []

两个键盘工具

keyboard_actions:有点像iOS的IQKeyboardManager,但是每个页面的交点都需要自己配置,有点费手 flutter_keyboard_visibility:这个更偏向于监听键盘变化与点击取消响应者,我个人觉得,比起上面费手的,这个更加合理一点

升级到3.19.5之后报的错

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());