已有的iOS原生工程配置Flutter

云市场 2020-09-16 11:40:59

如果已经有了原生工程,想在原生工程里面加入flutter模块,配置步骤如下:

1、假设原生工程是用cocoapods做的第三方库管理

2、在原生工程的同级目录新建flutter模块,请注意,一定要是同级目录。

如下图:
是一个大的文件夹,里面放iOS原生项目和flutter模块
在这里插入图片描述在这里插入图片描述

cd到该文件夹,创建新的flutter 模块,输入命令:flutter create -t module flutter_module ,其中,“flutter_module”是flutter的模块名,可以自己修改。

至此,flutter模块创建成功:
在这里插入图片描述

3、在原生项目做配置。在原生项目的podfile加入如下代码,其中,“flutter_module”就是你的flutter模块名,如果自己取了不同的模块名,写成相应的模块名即可。
flutter_application_path = ‘…/flutter_module’
load File.join(flutter_application_path, ‘.ios’, ‘Flutter’, ‘podhelper.rb’)
install_all_flutter_pods(flutter_application_path)

在这里插入图片描述

cd原生项目,然后pod install

4、原生项目里面调用flutter模块的代码:
(1)、首先,在原生项目的AppDelegate,加入如下代码:
在这里插入图片描述这一步的目的是进行注册。

(2)、在想要调用的地方,调用flutter模块,我直接在viewDidAppear里面调用了:
在这里插入图片描述

(3)、同时,也要在flutter模块的main.dart文件里面做相应的修改:
import ‘package:flutter/material.dart’;
import ‘dart:ui’; //该引入跟“window.defaultRouteName”相关

//以获取路由的方式启动
void main() => runApp(_widgetForRoute(window.defaultRouteName));

//获取路由名称
String _getRouteName(String name) {
if (name.indexOf(’?’) == -1) {
return name;
} else {
return name.substring(0, name.indexOf(’?’));
}
}

//根据不同的路由名称,返回相应的widget
Widget _widgetForRoute(String url) {
String route = _getRouteName(url);
return FlutterDemoClass(route: route);
}

class FlutterDemoClass extends StatefulWidget {
final String route;
FlutterDemoClass({this.route});

@override
_FlutterDemoClassState createState() => _FlutterDemoClassState();
}

class _FlutterDemoClassState extends State {
@override
Widget build(BuildContext context) {
return _getWidget();
}

Widget _getWidget() {
switch (widget.route) {
case ‘router_name’:
return MaterialApp(
theme: ThemeData(
primaryColor: Colors.white,
primaryColorDark: Colors.white10,
),
debugShowCheckedModeBanner: false,
home: CustomPage(
navTitle: ‘router_name’,
),
);
default:
return MaterialApp(
theme: ThemeData(
primaryColor: Colors.white,
primaryColorDark: Colors.white10,
),
debugShowCheckedModeBanner: false,
home: CustomPage(
navTitle: ‘默认页面’,
),
);
}
}
}

class CustomPage extends StatefulWidget {
final String navTitle;
CustomPage({this.navTitle});
@override
_CustomPageState createState() => _CustomPageState();
}

class _CustomPageState extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.navTitle),
),
body: Center(
child: Text(
‘这是一个页面’,
style: TextStyle(
color: Colors.orange, fontSize: 50, fontWeight: FontWeight.bold),
),
),
);
}
}

(4)、再次在原生项目里面调用flutter模块,如果报以下错误:
2020-09-06 11:46:17.168791+0800 FlutterDemo[38661:926252] Failed to find assets path for “Frameworks/App.framework/flutter_assets”
2020-09-06 11:46:17.301656+0800 FlutterDemo[38661:926588] [VERBOSE-2:engine.cc(134)] Engine run configuration was invalid.
2020-09-06 11:46:17.301903+0800 FlutterDemo[38661:926588] [VERBOSE-2:shell.cc(486)] Could not launch engine with configuration.

cd到原生工程,然后pod install, 如果还不行,cd到flutter模块的.ios目录,也是pod install,这样就解决了。

(5)、再次运行项目,成功:

本文转载自博主原创文章,原文链接:https://blog.csdn.net/u010186280/article/details/108429015