• 玩转平昌冬奥会俱乐部“喜力之家” 对话荷兰速滑选手 全球GO直播预告 2019-11-08
  • 2018年俄罗斯世界杯 揭幕战俄罗斯队大胜沙特队 2019-11-04
  • 这些人宁愿将每人吃过的饭菜倒掉喂猪,也不愿留给贫寒者,这种腐朽的资本主义的道德该收场了 2019-11-04
  • 崔永元骚扰范冰冰,怎么成了举报偷税漏税?他自己也不得不承认是在嫉妒之心嘛!(原创首发) 2019-10-29
  • Premier de China ofrece rueda de prensa Spanish.xinhuanet.com 2019-10-29
  • 各地一周答复网民留言四千项 最受关注领域与你息息相关 2019-10-26
  • 热心球迷!陈奕迅吴秀波惊现世界杯开幕式现场 2019-10-25
  • 《宋代古琴音乐研究》简介 2019-10-11
  • 足球只不过是个娱乐项目,吃饭赚钱才是安身立命必须要做的,不要跟着那些戏子瞎起哄。 2019-10-11
  • 打倒控房抄者有理,去分房好! 2019-09-28
  • 习近平点出“一带一路”取得积极成果的关键原因 2019-09-28
  • 安徽黄山:雾里赏荷宛入仙境 2019-09-26
  • 西安著名昆虫专家用50多万标本摸清秦岭昆虫“家底” 2019-09-25
  • 美丽的那拉提草原,我的家乡 2019-09-25
  • 【新媒体矩阵】河北经济网 2019-09-09
  • ?
    ?

    如何在Android和iOS中集成Flutter?

    • 发布者:geekpeer / 来源:开源中国 / 2018-12-03 20:05:35
    • 0

    上海时时乐走势图2oo期 www.gsfca.com 如何在Android和iOS中集成Flutter?

    Flutter可能是未来跨平台开发的又一技术框架,那么对于一个app,我们不可能完全用flutter来开发,那么就意味着我们需要在已有的Android和iOS代码中去集成flutter。目前这一技术还处于预览状态,并且还要切换flutter的channel为mater分支。如下,官方原话:

    如何在Android和iOS中集成Flutter?

    那么我们在集成之前需要查看现在flutter处于什么渠道:

    如何在Android和iOS中集成Flutter?

    我的是处于master分支,如果你以前没改过的话,应该是beta分支,那么可以执行:

    
    
    1. flutter channel master 

    进行切换。

    下面正式开始集成Android和iOS。

    Android

    首先用Android studio创建一个Android工程,步骤不做介绍了。然后在Android工程的根目录执行一下命令:

    
    
    1. flutter create -t module my_flutter 

    来创建一个flutter的module,成功之后,目录结构如下:

    如何在Android和iOS中集成Flutter?

    接着我们来修改一下Android功能里的gradle文件:

    首先是app的setting.gradle文件,添加如下:

    
    
    1. include ':app' 
    2. setBinding(new Binding([gradle: this]))                                  
    3. evaluate(new File(                                                       
    4.         settingsDir.parentFile,                                                
    5.         'my_flutter/.android/include_flutter.groovy'                           
    6. )) 

    目的就是去加载指定目录的include_flutter.groovy文件,那么我们查看一下这个文件:

    
    
    1. // Generated file. Do not edit. 
    2.  
    3. def scriptFile = getClass().protectionDomain.codeSource.location.path 
    4. def flutterProjectRoot = new File(scriptFile).parentFile.parentFile 
    5.  
    6. gradle.include ':flutter' 
    7. gradle.project(':flutter').projectDir = new File(flutterProjectRoot, '.android/Flutter'
    8.  
    9. def plugins = new Properties() 
    10. def pluginsFile = new File(flutterProjectRoot, '.flutter-plugins'
    11. if (pluginsFile.exists()) { 
    12.     pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 
    13.  
    14. plugins.each { name, path -> 
    15.     def pluginDirectory = flutterProjectRoot.toPath().resolve(path).resolve('android').toFile() 
    16.     gradle.include ":$name" 
    17.     gradle.project(":$name").projectDir = pluginDirectory 
    18.  
    19. gradle.getGradle().projectsLoaded { g -> 
    20.     g.rootProject.afterEvaluate { p -> 
    21.         p.subprojects { sp -> 
    22.             if (sp.name != 'flutter') { 
    23.                 sp.evaluationDependsOn(':flutter'
    24.             } 
    25.         } 
    26.     } 

    其中最重要的一段代码,就是include ':flutter',意思就是flutter这个module要参与编译。

    接着在app层级(不是project层)的build.gradle文件中添加依赖:

    
    
    1. dependencies { 
    2.   implementation project(':flutter'
    3.   : 

    OK配置阶段结束,我们开始先写Android代码,在activity中添加一个button,当我们点击它时,将加载flutter布局,代码如下:

    
    
    1. public class MainActivity extends AppCompatActivity { 
    2.     private TextView button; 
    3.  
    4.     @Override 
    5.     protected void onCreate(Bundle savedInstanceState) { 
    6.         super.onCreate(savedInstanceState); 
    7.         setContentView(R.layout.activity_main); 
    8.         button = findViewById(R.id.button); 
    9.         button.setOnClickListener(new View.OnClickListener() { 
    10.             @Override 
    11.             public void onClick(View view) { 
    12.                 FragmentTransaction tx = getSupportFragmentManager().beginTransaction(); 
    13.                 tx.replace(R.id.container, Flutter.createFragment("route1")); 
    14.                 tx.commit(); 
    15.  
    16. //                View flutterView = Flutter.createView(MainActivity.this,getLifecycle(),"route1"); 
    17. //                FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(100,100); 
    18. //                params.leftMargin = 100; 
    19. //                params.topMargin = 200; 
    20. //                addContentView(flutterView,params); 
    21.             } 
    22.         }); 
    23.     } 

    这里有两种实现方式,一种是使用fragment,一种是使用FlutterView。代码中的route1字符串则是flutter代码中定义的,接下来就开始写flutter代码:

    
    
    1. import 'dart:ui'
    2. import 'package:flutter/material.dart'
    3.  
    4. void main() => runApp(_widgetForRoute(window.defaultRouteName)); 
    5.  
    6. Widget _widgetForRoute(String route) { 
    7.   switch (route) { 
    8.     case 'route1'
    9.       return SomeWidget(); 
    10.     case 'route2'
    11.       return SomeWidget(); 
    12.     default
    13.       return Center( 
    14.         child: Text('Unknown route: $route', textDirection: TextDirection.ltr), 
    15.       ); 
    16.   } 
    17.  
    18.  
    19. class SomeWidget extends StatelessWidget{ 
    20.   @override 
    21.     Widget build(BuildContext context) { 
    22.       // TODO: implement build 
    23.       return Container( 
    24.          
    25.         width: 100, 
    26.         height: 100, 
    27.         color: Color(0xFF00FF00), 
    28.         child: Center( 
    29.           child: Text("hello",textDirection: TextDirection.ltr,), 
    30.         ), 
    31.       ); 
    32.     } 

    这里可以看到对rout1的定义。

    写到这里代码部分就完成了,然后运行android项目,就可以看到效果了。

    ios

    首先也是执行:

    
    
    1. flutter create -t module my_flutter 

    生成一个flutter工程,由于在Android集成中已经做了这一步,故跳过。然后用Xcode创建一个iOS工程,创建完成之后,目录如下:

    如何在Android和iOS中集成Flutter?

    下面为工程添加flutter的依赖,这里要使用cocoapods,若以前没有安装过,则执行命令:

    
    
    1. sudo gem install cocoapods 

    然后在iOS工程的根目录创建Podfile文件,命令为:

    
    
    1. touch Podfile 

    然后修改podfile文件,如下:

    
    
    1. target 'ios4Flutter' do 
    2. platform:ios,'8.0' 
    3.   
    4. flutter_application_path = '../my_flutter/' 
    5. eval(File.read(File.join(flutter_application_path, '.ios''Flutter''podhelper.rb')), binding) 
    6. end 

    其中ios4Flutter为我的iOS工程名,flutter_application_path为flutter工程的根目录。

    最后执行:

    
    
    1. pod install 

    完成项目的依赖,效果如下:

    如何在Android和iOS中集成Flutter?

    之后点击.xcworkSpace文件打开iOS工程,找到Build Phases目录,新建一个Script Phase,粘贴下面的命令:

    
    
    1. "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build  
    2. "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed 

    到text area,如下图:

    如何在Android和iOS中集成Flutter?

    配置完成之后,?B来build工程。如果没有报错,那么部署成功。下面开始写代码:

    在AppDelegate.h中:

    
    
    1. #import <UIKit/UIKit.h> 
    2. #import <Flutter/Flutter.h> 
    3.  
    4. @interface AppDelegate : FlutterAppDelegate 
    5. @end 

    AppDelegate.m:

    
    
    1. #import <FlutterPluginRegistrant/GeneratedPluginRegistrant.h> // Only if you have Flutter Plugins 
    2.  
    3. #include "AppDelegate.h" 
    4.  
    5. @implementation AppDelegate 
    6.  
    7. // This override can be omitted if you do not have any Flutter Plugins. 
    8. - (BOOL)application:(UIApplication *)application 
    9.     didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    10.   [GeneratedPluginRegistrant registerWithRegistry:self]; 
    11.   return [super application:application didFinishLaunchingWithOptions:launchOptions]; 
    12.  
    13. @end 

    ViewController.m:

    
    
    1. #import <Flutter/Flutter.h> 
    2. #import "ViewController.h" 
    3.  
    4. @implementation ViewController 
    5. - (void)viewDidLoad { 
    6.     [super viewDidLoad]; 
    7.     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    8.     [button addTarget:self 
    9.                action:@selector(handleButtonAction) 
    10.      forControlEvents:UIControlEventTouchUpInside]; 
    11.     [button setTitle:@"Press me" forState:UIControlStateNormal]; 
    12.     [button setBackgroundColor:[UIColor blueColor]]; 
    13.     button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0); 
    14.     [self.view addSubview:button]; 
    15.  
    16. - (void)handleButtonAction { 
    17.     FlutterViewController* flutterViewController = [[FlutterViewController alloc] init]; 
    18.     [flutterViewController setInitialRoute:@"route1"]; 
    19.     [self presentViewController:flutterViewController animated:false completion:nil]; 
    20. @end 

    OK,oc代码编写完成,运行app,呈现效果。

    Hot restart/reload and debugging Dart code

    我们可以运用dart语言的特性实现 hot reload,首先在flutter的根目录执行:

    
    
    1. flutter attach 

    如下:

    如何在Android和iOS中集成Flutter?

    当运行完app,点击按钮进入flutter的view时,终端状态如下:

    如何在Android和iOS中集成Flutter?

    当我们再次修改dart代码,保存之后,在命令中输入r即可hot reload。


    ?
    ?
  • 玩转平昌冬奥会俱乐部“喜力之家” 对话荷兰速滑选手 全球GO直播预告 2019-11-08
  • 2018年俄罗斯世界杯 揭幕战俄罗斯队大胜沙特队 2019-11-04
  • 这些人宁愿将每人吃过的饭菜倒掉喂猪,也不愿留给贫寒者,这种腐朽的资本主义的道德该收场了 2019-11-04
  • 崔永元骚扰范冰冰,怎么成了举报偷税漏税?他自己也不得不承认是在嫉妒之心嘛!(原创首发) 2019-10-29
  • Premier de China ofrece rueda de prensa Spanish.xinhuanet.com 2019-10-29
  • 各地一周答复网民留言四千项 最受关注领域与你息息相关 2019-10-26
  • 热心球迷!陈奕迅吴秀波惊现世界杯开幕式现场 2019-10-25
  • 《宋代古琴音乐研究》简介 2019-10-11
  • 足球只不过是个娱乐项目,吃饭赚钱才是安身立命必须要做的,不要跟着那些戏子瞎起哄。 2019-10-11
  • 打倒控房抄者有理,去分房好! 2019-09-28
  • 习近平点出“一带一路”取得积极成果的关键原因 2019-09-28
  • 安徽黄山:雾里赏荷宛入仙境 2019-09-26
  • 西安著名昆虫专家用50多万标本摸清秦岭昆虫“家底” 2019-09-25
  • 美丽的那拉提草原,我的家乡 2019-09-25
  • 【新媒体矩阵】河北经济网 2019-09-09
  • 欧冠总进球c罗 新版手机上市 神算子一尾中特期期准 湖南幸运赛车历史开奖结果 香港六合彩特码资料 江西多乐彩基本走势图彩乐乐 福建招标信息网 澳洲幸运5最快开奖结果 2019年59期内部透码彩图 福建15选5基本走势图表 七星彩开奖公告 幸运28是正规福彩吗? 百人牛牛规则与技巧 足球大师网页和手游 彩客网竞彩足球篮球预测推荐