当前位置:   article > 正文

Flutter 基础之接口实现初步学习_flutter中定义接口

flutter中定义接口

1、 Flutter main 入口

Flutter 项目的入口是 main 函数,项目运行的开始

Flutter 在 android 项目里会把 Flutter 的 main 入口编译成 MainActivity

而这个 MainActivity 则继承自 FlutterActivity

示例:

  1. class MainActivity(): FlutterActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. GeneratedPluginRegistrant.registerWith(this)
  5. }
  6. }

Flutter 就是在 android 中开始的,Flutter 编译的 android 项目只有这么一个 Activity 的。

2.、FlutterActivity

FlutterActivity ,是声明了 Provider, PluginRegistry, ViewFactory 3个接口,然后实现

  1. Provider | ViewFactory - 是提供 view 视图的

  2. PluginRegistry 着一连串方法可以看到是代理了 Activity N多生命周期函数

  3. 示例:

  1. /// activity实现了三个接口
  2. public class FlutterActivity extends Activity implements Provider, PluginRegistry, ViewFactory {
  3. /// 视图提供类,一个方法getFlutterView
  4. public interface Provider {
  5. FlutterView getFlutterView();
  6. }
  7. /// 插件注册
  8. public interface PluginRegistry {
  9. /// 注册一个插件
  10. PluginRegistry.Registrar registrarFor(String var1);
  11. /// 是否有这个插件
  12. boolean hasPlugin(String var1);
  13. /// 插件发布值
  14. <T> T valuePublishedByPlugin(String var1);
  15. /// 下面开始为插件生命周期回调
  16. public interface PluginRegistrantCallback {
  17. void registerWith(PluginRegistry var1);
  18. }
  19. /// 显然是视图销毁的回调
  20. public interface ViewDestroyListener {
  21. boolean onViewDestroy(FlutterNativeView var1);
  22. }
  23. 不知道是什么,先留着看
  24. public interface UserLeaveHintListener {
  25. void onUserLeaveHint();
  26. }
  27. activity生命周期回调onNewIntent
  28. public interface NewIntentListener {
  29. boolean onNewIntent(Intent var1);
  30. }
  31. activity生命周期回调onActivityResult
  32. public interface ActivityResultListener {
  33. boolean onActivityResult(int var1, int var2, Intent var3);
  34. }
  35. activity生命周期回调之onRequestPermissionsResult
  36. public interface RequestPermissionsResultListener {
  37. boolean onRequestPermissionsResult(int var1, String[ var2, int[ var3);
  38. }
  39. /// 插件的注册者,相当于插件的宿主。
  40. public interface Registrar {
  41. Activity activity();
  42. Context context();
  43. Context activeContext();
  44. /// 这个BinaryMessager不知道做什么的
  45. BinaryMessenger messenger();
  46. /// TextureRegistry暂不清楚
  47. TextureRegistry textures();
  48. /// 获取视图
  49. FlutterView view();
  50. /// 寻找资源
  51. String lookupKeyForAsset(String var1);
  52. /// 寻找资源
  53. String lookupKeyForAsset(String var1, String var2);
  54. /// 发布值,与上面的valuePublishedByPlugin对应
  55. PluginRegistry.Registrar publish(Object var1);
  56. /// 增加生命周期回调
  57. PluginRegistry.Registrar addRequestPermissionsResultListener(PluginRegistry.RequestPermissionsResultListener var1);
  58. /// 增加生命周期回调
  59. PluginRegistry.Registrar addActivityResultListener(PluginRegistry.ActivityResultListener var1);
  60. PluginRegistry.Registrar addNewIntentListener(PluginRegistry.NewIntentListener var1);
  61. /// 增加生命周期回调
  62. PluginRegistry.Registrar addUserLeaveHintListener(PluginRegistry.UserLeaveHintListener var1);
  63. /// 增加生命周期回调
  64. PluginRegistry.Registrar addViewDestroyListener(PluginRegistry.ViewDestroyListener var1);
  65. }
  66. }
  67. /// 视图工厂
  68. public interface ViewFactory {
  69. /// 创建flutterView
  70. FlutterView createFlutterView(Context var1);
  71. 创建nativeview
  72. FlutterNativeView createFlutterNativeView();
  73. /// 暂不清楚
  74. boolean retainFlutterNativeView();
  75. }
  76. private final FlutterActivityEvents eventDelegate = delegate;
  77. private final FlutterView.Provider viewProvider = delegate;
  78. private final PluginRegistry pluginRegistry = delegate;
  79. @Override
  80. protected void onCreate(Bundle savedInstanceState) {
  81. super.onCreate(savedInstanceState);
  82. eventDelegate.onCreate(savedInstanceState);
  83. }

3、 FlutterActivityDelegate

FlutterActivity 把包括 onCreate 在内的所有生命周期函数都交给 eventDelegate 这个代理了, eventDelegate 的类型是 FlutterActivityEvents ,那么重点是我们看看 FlutterActivityEvents 的 onCreate 

  1. public final class FlutterActivityDelegate implements FlutterActivityEvents, FlutterView.Provider, PluginRegistry {
  2. ........
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  6. Window window = activity.getWindow();
  7. window.addFlags(LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
  8. window.setStatusBarColor(0x40000000);
  9. window.getDecorView().setSystemUiVisibility(PlatformPlugin.DEFAULT_SYSTEM_UI);
  10. }
  11. String[ args = getArgsFromIntent(activity.getIntent());
  12. FlutterMain.ensureInitializationComplete(activity.getApplicationContext(), args);
  13. flutterView = viewFactory.createFlutterView(activity);
  14. if (flutterView == null) {
  15. FlutterNativeView nativeView = viewFactory.createFlutterNativeView();
  16. flutterView = new FlutterView(activity, null, nativeView);
  17. flutterView.setLayoutParams(matchParent);
  18. activity.setContentView(flutterView);
  19. launchView = createLaunchView();
  20. if (launchView != null) {
  21. addLaunchView();
  22. }
  23. }
  24. if (loadIntent(activity.getIntent())) {
  25. return;
  26. }
  27. String appBundlePath = FlutterMain.findAppBundlePath(activity.getApplicationContext());
  28. if (appBundlePath != null) {
  29. runBundle(appBundlePath);
  30. }
  31. }
  32. }

其中核心就是创建出 FlutterView 这个 view 对象,然后把 FlutterView setContentView 给 activity,这样就完成了从 Flitter 到 android 平台的显示,MainActivity 这个AC 可是只有 FlutterView 这一个 view ,Flutter 所有的 UI 组件都是由 FlutterView 使用 canvas 直接绘制的。Flutter 就是这样和 android 联系的,脱离了 android 传统的 xml 布局方式,节省了 xml dom 解析反射生成 viewTree 的操作。

4. FlutterView

FlutterView 可以解答我们非常核心问题,

  1. public class FlutterView extends SurfaceView implements BinaryMessenger, TextureRegistry {
  2. public FlutterView(Context context, AttributeSet attrs, FlutterNativeView nativeView) {
  3. super(context, attrs);
  4. Activity activity = (Activity) getContext();
  5. if (nativeView == null) {
  6. mNativeView = new FlutterNativeView(activity.getApplicationContext());
  7. } else {
  8. mNativeView = nativeView;
  9. }
  10. mSurfaceCallback = new SurfaceHolder.Callback() {
  11. @Override
  12. public void surfaceCreated(SurfaceHolder holder) {
  13. assertAttached();
  14. mNativeView.getFlutterJNI().onSurfaceCreated(holder.getSurface());
  15. }
  16. @Override
  17. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  18. assertAttached();
  19. mNativeView.getFlutterJNI().onSurfaceChanged(width, height);
  20. }
  21. @Override
  22. public void surfaceDestroyed(SurfaceHolder holder) {
  23. assertAttached();
  24. mNativeView.getFlutterJNI().onSurfaceDestroyed();
  25. }
  26. };
  27. }

FlutterView 又是继承自 SurfaceView ,就是说 UI 绘制不是由 android UI 线程完成,而是由 Flutter 自己完成。

代码中 FlutterView 的绘制实际交给了 FlutterNativeView.getFlutterJNI() - FlutterJNI完成,

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/973752
推荐阅读
相关标签
  

闽ICP备14008679号