Skip to content

YouCii/FlutterDemo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

58 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FlutterDemo

Codacy Badge

测试Demo

遇到问题欢迎提Issue, 共同进步

应用内用到的东西

Flutter调用原生的Plugin流程

Plugin部分
  1. Pluginandroid/iosMyFlutterPlugin:MethodCallHandler提供原生方法, 并定义ChannelName:
     companion object {
         @JvmStatic
         fun registerWith(registrar: Registrar) {
             val channel = MethodChannel(registrar.messenger(), "统一的渠道名字")
             channel.setMethodCallHandler(MyFlutterPlugin(registrar.activity()))
         }
     }
  2. Pluginflutter_plugin.dart内获取到android/ios内部内定的Channel, 并暴露Plugin方法 ( 类似于代理原生方法, 其实这也是plugin的目的 ) :
     static const MethodChannel _channel = const MethodChannel('统一的渠道名字');
     
     static Future<String> get goToOtherApp async {
       final String result = await _channel.invokeMethod('goToOtherApp');
       return result;
     }
  3. Pluginpubspec.yaml文件标明此Plugin的信息, 以供主项目引用
     flutter:
       plugin:
         androidPackage: com.youcii.flutter_plugin
         pluginClass: MyFlutterPlugin
主项目部分
  1. 主项目的pubspec.yaml中引用Plugin, 名字可自定义:
     dev_dependencies:
       flutter_plugin:
         path: flutter_plugin
  2. 主项目的android/ios自动依赖到Pluginandroid/ios( 通过主项目build.gradlemerge操作 ), 自动编译注册MyFlutterPlugin(这一层无需任何手动操作):
     MyFlutterPlugin.registerWith(registry.registrarFor("com.youcii.flutter_plugin.MyFlutterPlugin"));
  3. 主项目调用Plugin内的原生方法时, 只需要以下操作:
     import 'package:flutter_plugin/flutter_plugin.dart';
     // 必须异步调用
     Future<void> _initPlatformState() async {
       try {
         _result = await FlutterPlugin.goToOtherApp;
       } on PlatformException {
         _result = 'Failed to get platform version.';
       }
       setState(() {
         _result = _result;
       });
     }

生命周期全解析

  1. onCreate: initState或者didChangeDependencies(后者更强大)
  2. onResume: didPush(从前一页面进入时),didPopNext(从后一页面返回时)
  3. onPause: didPushNext(进入到后一页面前),didPop(返回前一页面)
  4. onDestroy: dispose
  5. 前后台切换: didChangeAppLifecycleState

构造方法相关

  1. 不允许在factory中引用当前类的示例;
  2. 可以定义别名构造方法, 例如:SingleObject.create();
  3. 如果显示声明某种形式的构造方法, 则只允许使用显示声明的构造形式;

Sliver家族:

  1. SliverAppBar: 实现类似Android#CollapsingToolbarLayout的动画
  2. SliverGrid: 组合Grid列表
  3. SliverPersistentHeader: 可中间插入/固定在顶部/缩放的Header
  4. SliverFixedExtentList: 比SliverList效果更高的组合列表(因为固定了item在主轴方向上的长度)

代码执行顺序

同步代码 > MicroTask Queue > Event Queue, 其中EventQueue中的Event包括:

  1. dart产生的事件: Future, Timer, Isolate之间的消息等;
  2. 系统产生的事件: I/O, 鼠标事件, 屏幕点击等;

自定义叶子RenderObject的关键点

  1. 继承RenderObject的子类RenderBox更简单, 它在父类的基础上实现了笛卡尔坐标系, 更易用;
  2. 如果不重写isRepaintBoundary为true或者用RepaintBoundary包裹的话, 会出现offset偏移的情况;
  3. paint方法中需要刷新一下修改的参数/或者修改变量时修改painter参数, 才可以支持外部setState时该参数的刷新;
  4. isRepaintBoundary返回true时必须重写此方法去掉super, 否则红屏错误;
    @override
    void performLayout() {
       size = constraints.constrain(Size(_starSize, _starSize));
    }
  5. 如果想要监听onTap就必须重写hitTestSelf然后按情况返回, 作为叶子widget时直接返回true;
  6. 修改RenderObject的内部参数时, 记得在set方法中调用markNeedsPaint或者markNeedsLayout将其标为dirty状态, 否则setState不会更新它;
  7. 使用RenderObjectLeafRenderObjectWidget需要重写updateRenderObject修改下UI关心的参数, 否则setState不会更新这些参数;
  8. CustomPaintCustomPainter也可以实现自定义效果, 但是细节有点差别;

About

Flutter测试Demo

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published