Flutter学习笔记——day1
本文是使用Android studio中flutter模板项目实验的
注意:植入FlutterView后页面会采用沉侵式布局,如果没有设置透明状态栏就会导致页面被遮挡
一、简单使用
1、新建activity继承FlutterActivity
class TwoActivity : FlutterActivity() {
// private var routeStr = ""
//
// override fun createFlutterView(context: Context): FlutterView {
// val matchParent = WindowManager.LayoutParams(-1, -1)
// val nativeView = this.createFlutterNativeView()
// val flutterView = FlutterView(this@TwoActivity, null as AttributeSet?, nativeView)
// flutterView.setInitialRoute(routeStr)
// flutterView.setLayoutParams(matchParent)
// this.setContentView(flutterView)
// return flutterView
// }
override fun onCreate(savedInstanceState: Bundle?) {
// routeStr = "/first_page" //指定启动页面
super.onCreate(savedInstanceState)
GeneratedPluginRegistrant.registerWith(this)
}
}
2、修改AndroidManifest文件
<application
android:name="io.flutter.app.FlutterApplication"
android:icon="@mipmap/ic_launcher"
android:label="flutter_app">
......
<activity
android:name=".TwoActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat"
android:windowSoftInputMode="adjustResize">
<meta-data
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
android:value="true" />
</activity>
</application>
3、main.dart文件
void main() {
runApp(FlutterView());
}
class FlutterView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'FlutterView',
theme: ThemeData(primarySwatch: Colors.blue),
home: MyHomePage(),
routes: <String, WidgetBuilder> {
//注册页面路径,用于指定启动
'first_page': (BuildContext context) => FirstPage(),
'one_page' : (BuildContext context) => OnePage(),
}
);
}
}
//StatefulWidget 页面数据可变
class MyHomePage extends StatefulWidget {
......
}
//StatelessWidget 页面数据不可变
class OnePage extends StatelessWidget {
......
}
class FirstPage extends StatelessWidget {
......
}
二、在原生Activity中将Flutter布局当做View使用
1、新建空白Activity1(继承Activity/AppCompatActivity)
2、在AndroidManifest中注册
<activity
android:name=".OneActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat"
android:windowSoftInputMode="adjustResize">
<meta-data
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
android:value="true" />
</activity>
3、新建布局文件activity_one.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<io.flutter.view.FlutterView
android:id="@+id/flutter_view_1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
4、编辑OneActivity中业务逻辑
class OneActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//确保FlutterMain初始化完成
FlutterMain.ensureInitializationComplete(applicationContext, null)
setContentView(R.layout.activity_one) //注意设置布局的位置
var flutterRunArguments = FlutterRunArguments()
//绑定路径
flutterRunArguments.bundlePath = FlutterMain.findAppBundlePath(applicationContext)
//获取入口 main方法
flutterRunArguments.entrypoint = "main"
//指定启动页面
// flutter_view_1.setInitialRoute("one_page")
//flutterview 运行设置绑定
flutter_view_1.runFromBundle(flutterRunArguments)
}
override fun onPause() {
super.onPause()
flutter_view_1.onPause()
}
override fun onPostResume() {
super.onPostResume()
flutter_view_1.onPostResume()
}
}
新建Activity,build报错
Gradle DSL method not found: '1.3.21()' Possible causes:<ul><li>The project 'android' may be using a version of Gradle that does not contain the method. Open Gradle wrapper file</li><li>The build file may be missing a Gradle plugin. Apply Gradle plugin</li>
原因:工程bulid.gradle文件中ext.kotlin_version = '1.3.21' '1.2.71'
导致的
处理:修改工程bulid.gradle文件中ext.kotlin_version = '1.3.21' '1.2.71'
为ext.kotlin_version = '1.2.71'
↩︎