Giter Site home page Giter Site logo

yangchong211 / ychybridflutter Goto Github PK

View Code? Open in Web Editor NEW
71.0 71.0 10.0 101.81 MB

Android和flutter混合开发案例

License: Apache License 2.0

Java 16.50% Dart 71.26% Groovy 0.09% Objective-C 9.42% Ruby 1.13% C 0.45% Shell 0.06% Kotlin 1.05% Swift 0.04%

ychybridflutter's Introduction

Anurag's github stats

ychybridflutter's People

Contributors

yangchong211 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

ychybridflutter's Issues

flutter模块放哪里都行

配置好编译文件就行,比如可以这样:

evaluate(new File(
'E:\flutter\module_flutter/.android/include_flutter.groovy'
))

FlutterFragment&原生Fragment共存问题

我在项目中遇到了一个FlutterFragment和原生Fragment共存的问题。

项目主页采用BottomNavigationView+Fragment的结构,切换底部导航时使用FragmentManager.hide隐藏其他fragment,show展示当前fragment的逻辑,例如:

[FragmentA , FragmentB , FragmentC]

[index0 , index1 , index2 ]

FragmentA继承自FlutterFragment;

FragmentBC为原生Fragment;

遇到的问题:默认展示B,切换到A,待Flutter页面加载完成,再切换回B,然后跳转到新Activity后返回当前页面。

理论上应该还是展示B,但此时展示的为A.

但当我将调用的api改为FragmentManager.replace之后,这个现象就消失了.

public class FlutterFragmentCachedActivity extends AppCompatActivity {

    private FrameLayout rlFlutter;
    private FlutterFragment flutterFragment;
    private Fragment nativeFragment;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_flutter_fragment);
        rlFlutter = findViewById(R.id.rl_flutter);
        addFlutterView();
        initView();
    }

    private void initView() {
        showFragment(0);
    }
    public void showNative(View view){
        showFragment(0);
    }
    public void showFlutter(View view){
        showFragment(1);
    }
    public void jump(View view){
        Intent intent = new Intent(this,DemoActivity.class);
        startActivity(intent);
    }

    private void showFragment(int index){
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
//        if(flutterFragment != null){
//            transaction.hide(flutterFragment);
//        }
//        if(nativeFragment != null){
//            transaction.hide(nativeFragment);
//        }
        switch (index){
            case 0:
                nativeFragment = getSupportFragmentManager().findFragmentByTag("native");
                if(nativeFragment == null){
                    nativeFragment = new DemoFragment();
                }
//                if(!nativeFragment.isAdded()){
//                    transaction.add(R.id.rl_flutter,nativeFragment,"native");
//                }
                transaction.replace(R.id.rl_flutter,nativeFragment);
                break;
            case 1:
                flutterFragment = (FlutterFragment) getSupportFragmentManager().findFragmentByTag("flutter");
                if(flutterFragment == null){
                    flutterFragment = FlutterFragment.withCachedEngine("my_engine_id").build();
                }
//                if(!flutterFragment.isAdded()){
//                    transaction.add(R.id.rl_flutter,flutterFragment,"flutter");
//                }
                transaction.replace(R.id.rl_flutter,flutterFragment);
                break;
            default:
                break;
        }
        transaction.commitAllowingStateLoss();
    }


    private void addFlutterView() {
        // 通过FlutterFragment引入Flutter编写的页面
        // 通过FlutterFragment.createDefault()创建出FlutterFragment
        // 需要注意这里的FlutterFragment位于io.flutter.embedding.android包中
        //FlutterFragment flutterFragment = FlutterFragment.createDefault();

        // 创建可缓存的FlutterEngine对象
        FlutterEngine flutterEngine = new FlutterEngine(this);
        flutterEngine.getNavigationChannel().setInitialRoute("yc");
        flutterEngine.getDartExecutor().executeDartEntrypoint(
                DartExecutor.DartEntrypoint.createDefault()
        );
        // todo 放在这里不生效,思考为什么
        // flutterEngine.getNavigationChannel().setInitialRoute("yc");
        // 将FlutterEngine缓存起来,这里传入的"my_engine_id"就相当于缓存名称。
        FlutterEngineCache.getInstance().put("my_engine_id", flutterEngine);

        // 通过FlutterFragment引入Flutter编写的页面
        // 过FlutterFragment.withCachedEngine()方法来创建FlutterFragment,参数传入上面的缓存名称。
        // 需要注意,withCachedEngine()方法返回的是一个CachedEngineFragmentBuilder对象,
        // 同样是使用了建造者模式,但是它是没有initialRoute()方法的,如果我们要指定初始路由,
        // 需要在创建FlutterEngine对象时通过setInitialRoute()方法来设置。
//        FlutterFragment flutterFragment = FlutterFragment.withCachedEngine("my_engine_id").build();
//
//        //放在这里不生效,思考为什么
//        //flutterEngine.getNavigationChannel().setInitialRoute("yc");
//
//        getSupportFragmentManager()
//                .beginTransaction()
//                .add(R.id.rl_flutter, flutterFragment)
//                .commit();

        //放在这里不生效,思考为什么
        // todo flutterEngine.getNavigationChannel().setInitialRoute("yc");
    }


}

.android文件夹是编译自动生成的吧

使用中,删除了这个.android文件夹,怎么不自动生成了,,

新建了.android/include_flutter.groovy文件,并复制上了内容,还是不行啊,怎么破?

请问如何调试

as调试java端,vscode调试dart?但是vscode会删除.android文件夹,造成 #1 问题?

请教合理的debug方式... 😄

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.