Skip to content

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

Packages

Used by

Contributors

Languages