Flutterflutter 组件

flutter 原生跳转到装有flutterView的原生act

2019-03-28  本文已影响0人  kot_flu

FlutterView 是用来装载flutter widget的载体,可以在原生上面直接添加 ,有人说会有黑屏,很奇怪,我这边没有碰到哦

首先项目是直接新建的flutter 项目,单独打开android项目,项目视图是这样的


项目视图.jpg

项目的build.gradle上面注意要引入flutter

implementation project(':flutter')
项目视图2.jpg

这个时候原生项目就可以使用 flutterView了,就不会报警告了

项目就简单了建立了2个Activity,如下图


项目视图3.jpg

接下来就直接贴代码了,很简单
MainActivity.class

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button open = findViewById(R.id.openBtn);
        open.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, MyFlutterActivity.class);
                startActivity(intent);
            }
        });

    }
}

activity_main.xml布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/openBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="打开flutter页面" />


</RelativeLayout>

第二个Activity MyFlutterActivity.class

public class MyFlutterActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_flutter);

        final FlutterView flutterView = Flutter.createView(
                this,
                getLifecycle(),
                "route1"
        );


        final FrameLayout layout = findViewById(R.id.flutter_container);
        layout.addView(flutterView);

        final FlutterView.FirstFrameListener[] listeners = new FlutterView.FirstFrameListener[1];
        listeners[0] = new FlutterView.FirstFrameListener() {
            @Override
            public void onFirstFrame() {
                layout.setVisibility(View.VISIBLE);
            }
        };
        flutterView.addFirstFrameListener(listeners[0]);
    }
}

布局代码activity_flutter.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              android:visibility="visible">

    <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="原生text"/>

    <FrameLayout android:id="@+id/flutter_container"
            android:layout_width="match_parent" android:layout_height="match_parent"></FrameLayout>

</LinearLayout>

记得要去manifest里面去注册activity

接下来就是flutter了,先看一下项目结构


flutter结构.jpg

然后就是代码了 main.dart

import 'dart:ui';

import 'package:flutter/material.dart';

void main() => runApp(
    _widgetForRoute(window.defaultRouteName)
);

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

Widget _widgetForRoute(String route) {
return MyApp();
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

代码就这样结束了,最后跑起来看下效果图


效果1.jpg
效果2.jpg

亲测没有黑屏,如果有问题,请留言

native 和 flutter 的混合界面如下


原生和flutter view.jpg
上一篇下一篇

猜你喜欢

热点阅读