| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package dev.flutter.multipleflutters |
| |
| import android.content.Intent |
| import androidx.appcompat.app.AppCompatActivity |
| import android.os.Bundle |
| import android.view.View |
| import android.widget.FrameLayout |
| import android.widget.LinearLayout |
| import android.widget.TextView |
| import androidx.fragment.app.FragmentActivity |
| import androidx.fragment.app.FragmentManager |
| import io.flutter.FlutterInjector |
| import io.flutter.embedding.android.FlutterFragment |
| import io.flutter.embedding.engine.FlutterEngine |
| import io.flutter.embedding.engine.FlutterEngineCache |
| import io.flutter.embedding.engine.dart.DartExecutor |
| |
| class MainActivity : FragmentActivity() { |
| private val numberOfFlutters = 20 |
| |
| override fun onCreate(savedInstanceState: Bundle?) { |
| super.onCreate(savedInstanceState) |
| val root = LinearLayout(this) |
| root.layoutParams = LinearLayout.LayoutParams( |
| LinearLayout.LayoutParams.MATCH_PARENT, |
| LinearLayout.LayoutParams.MATCH_PARENT |
| ) |
| root.orientation = LinearLayout.VERTICAL |
| root.weightSum = numberOfFlutters.toFloat() |
| |
| val fragmentManager: FragmentManager = supportFragmentManager |
| |
| setContentView(root) |
| |
| val app = applicationContext as App |
| val dartEntrypoint = |
| DartExecutor.DartEntrypoint( |
| FlutterInjector.instance().flutterLoader().findAppBundlePath(), "main" |
| ) |
| val engines = generateSequence(0) { it + 1 } |
| .take(numberOfFlutters) |
| .map { app.engines.createAndRunEngine(this, dartEntrypoint) } |
| .toList() |
| for (i in 0 until numberOfFlutters) { |
| val flutterContainer = FrameLayout(this) |
| root.addView(flutterContainer) |
| flutterContainer.id = 12345 + i |
| flutterContainer.layoutParams = LinearLayout.LayoutParams( |
| FrameLayout.LayoutParams.MATCH_PARENT, |
| FrameLayout.LayoutParams.MATCH_PARENT, |
| 1.0f |
| ) |
| val engine = engines[i] |
| FlutterEngineCache.getInstance().put(i.toString(), engine) |
| val flutterFragment = |
| FlutterFragment.withCachedEngine(i.toString()).build<FlutterFragment>() |
| fragmentManager |
| .beginTransaction() |
| .add( |
| 12345 + i, |
| flutterFragment |
| ) |
| .commit() |
| } |
| } |
| |
| override fun onDestroy() { |
| for (i in 0 until numberOfFlutters) { |
| FlutterEngineCache.getInstance().remove(i.toString()) |
| } |
| |
| super.onDestroy() |
| } |
| } |