无法预热引擎,他们稍后在 Android 上使用它



我有一个供客户端使用的android SDK,SDK有一些抽象,所以客户端不必处理颤振绑定。

我 SDK 我有这样的东西


class SDKPrivate  {
private static FlutterEngine flutterEngine;
...
public void initFlutterEngine(Context context){
if(SDKPrivate.flutterEngine != null) return;
SDKPrivate.flutterEngine = new FlutterEngine(context);
SDKPrivate.flutterEngine.getDartExecutor()
.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault());
}
MyFragment createFragment() {
return new MyFragment();
}
...
}

片段类为

public class MyFragment extends FlutterFragment {
@Override
public boolean shouldAttachEngineToActivity() {
return true;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated( savedInstanceState);
GeneratedPluginRegistrant.registerWith(sdkPrivate.getEngine());
}
@Override
@Nullable
public FlutterEngine provideFlutterEngine(@NonNull Context context) {
return sdkPrivate.getEngine();
}

在我为执行测试而创建的示例应用中,我有一个主要活动

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

它有一个按钮,可以调用我的新活动,里面有MyFragment

Intent activity2Intent = new Intent(getApplicationContext(), FragActivity.class);
startActivity(activity2Intent);

弗拉格活动是这样的

public class FragActivity extends AppCompatActivity  {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frag);
MyFragment  frag = SDKPrivate.createFragment();
getSupportFragmentManager()
.beginTransaction()
.add(R.id.frame_layout, frag,  BuildConfig.APPLICATION_ID + ".MyFragment")
.commit();
}
}

当我进入 FragActivity 时有这样的代码时,应用程序保持空白。但是,如果我在 FragActivity 中启动引擎,该应用程序将按预期工作。

像这样,没关系

public class FragActivity extends AppCompatActivity  {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frag);
SDKPrivate.initFlutterEngine(getApplicationContext());
//Same code as showed above 
...
}

这有什么原因吗?我还想给客户端一种预热引擎的方法,然后在片段和活动上使用它,而无需创建新引擎。

颤振医生-V

[✓] Flutter (Channel stable, v1.12.13+hotfix.5, on Mac OS X 10.15.1 19B2093, locale en-PT)
• Flutter version 1.12.13+hotfix.5 at /Users/manuelpeixoto/flutter
• Framework revision 27321ebbad (6 weeks ago), 2019-12-10 18:15:01 -0800
• Engine revision 2994f7e1e6
• Dart version 2.7.0

[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
• Android SDK at /Users/manuelpeixoto/Library/Android/sdk/
• Android NDK location not configured (optional; useful for native profiling support)
• Platform android-29, build-tools 29.0.2
• ANDROID_HOME = /Users/manuelpeixoto/Library/Android/sdk/
• Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
• All Android licenses accepted.
[✓] Xcode - develop for iOS and macOS (Xcode 11.2.1)
• Xcode at /Applications/Xcode.app/Contents/Developer
• Xcode 11.2.1, Build version 11B500
• CocoaPods version 1.8.4
[✓] Android Studio (version 3.5)
• Android Studio at /Applications/Android Studio.app/Contents
• Flutter plugin version 42.0.1
• Dart plugin version 191.8593
• Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
[✓] VS Code (version 1.41.1)
• VS Code at /Applications/Visual Studio Code.app/Contents
• Flutter extension version 3.7.1
[✓] Connected device (2 available)
• XT1097                   • 0016256677                • android-arm • Android 6.0 (API 23)
• iPhone  • 00008030-000A053901D0802E • ios         • iOS 13.3
• No issues found!

我能够解决问题,我的 main.dart 中有这一行

await SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitUp, DeviceOrientation.portraitDown])

由于某种原因,这使得颤振初始化停止。

我把它改成了,

unawaited(SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]))

它按预期工作。

创建引擎后,请缓存它以供以后使用。 缓存预热的 FlutterEngine 以供 FlutterFragment 稍后使用。 FlutterEngineCache .getInstance(( .put("my_engine_id", flutterEngine(;

并在颤振片段中使用它作为 flutterFragment.withCachedEngine("my_engine_id"(.build((;

最新更新