Flutter 从手机背景进入后,Flatter显示黑屏
只有在android上运行时,我才会遇到问题。当我隐藏应用程序,然后在不完全关闭的情况下再次打开它时,就会发生这种情况 该应用程序的基本功能是通过FlatterPlatformView显示Android Sceneform、SceneView或iOS Scenekit SCNView。我试过缓存引擎,但是运气不好,我没有主意了 以下是我的主要活动:Flutter 从手机背景进入后,Flatter显示黑屏,flutter,Flutter,只有在android上运行时,我才会遇到问题。当我隐藏应用程序,然后在不完全关闭的情况下再次打开它时,就会发生这种情况 该应用程序的基本功能是通过FlatterPlatformView显示Android Sceneform、SceneView或iOS Scenekit SCNView。我试过缓存引擎,但是运气不好,我没有主意了 以下是我的主要活动: private val database = Database(DatabaseDriverFactory(context)) p
private val database = Database(DatabaseDriverFactory(context))
private lateinit var sceneViewFactory: FlutterSceneViewFactory
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
registerSceneView(flutterEngine)
super.configureFlutterEngine(flutterEngine)
}
private fun registerSceneView(flutterEngine: FlutterEngine) {
val viewModel = FlutterSceneViewModel(database)
sceneViewFactory = FlutterSceneViewFactory(flutterEngine.dartExecutor.binaryMessenger, viewModel)
GeneratedPluginRegistrant.registerWith(flutterEngine)
flutterEngine.platformViewsController.registry.registerViewFactory("SceneView", sceneViewFactory)
FlutterEngineCache.getInstance().put("flutterEngine", flutterEngine)
}
}
观点:
class FlutterSceneView(context: Context, private val viewModel: FlutterSceneViewModel): PlatformView {
private val context = context
private var sceneView = SceneView(context)
override fun onFlutterViewAttached(flutterView: View) {
setBIMScene()
sceneView.resume()
listenToBackgroundColor()
}
private fun setBIMScene() {
ModelRenderable.builder()
.setSource(context, R.raw.bimtest)
.build()
.thenAccept {
addNodeToScene(it)
}
.exceptionally {
val toast = Toast.makeText(context, "Unable to load BIM renderable", Toast.LENGTH_LONG)
toast.setGravity(Gravity.CENTER, 0, 0)
toast.show()
null
}
}
private fun addNodeToScene(model: ModelRenderable) {
val transformationSystem = makeTransformationSystem()
val dragTransformableNode = DragTransformableNode(3f, transformationSystem)
dragTransformableNode.renderable = model
sceneView.scene?.addChild(dragTransformableNode)
dragTransformableNode.select()
sceneView.scene
?.addOnPeekTouchListener { hitTestResult: HitTestResult?, motionEvent: MotionEvent? ->
transformationSystem.onTouch(
hitTestResult,
motionEvent
)
}
}
private fun makeTransformationSystem(): TransformationSystem {
val footprintSelectionVisualizer = FootprintSelectionVisualizer()
return TransformationSystem(context.resources.displayMetrics, footprintSelectionVisualizer)
}
private fun listenToBackgroundColor() {
viewModel.colorFlow.onEach {
val newColor = Color.parseColor(it)
sceneView.setBackgroundColor(newColor)
}.launchIn(viewModel.viewModelScope)
}
override fun getView(): View {
return sceneView
}
override fun dispose() {
sceneView.destroy()
}
}
以及它在main.dart中的添加方式:
class BIMHomePage extends StatefulWidget {
BIMHomePage({Key key, this.viewModel}) : super(key: key);
final BIMHomePageViewModelType viewModel;
Widget getPlatformSceneView() {
final String viewType = "SceneView";
if (Platform.isAndroid) {
return AndroidView(viewType: viewType);
} else if (Platform.isIOS) {
return UiKitView(viewType: viewType);
} else {
return Center(child: Text("Platform view not supported"));
}
}
@override
BIMHomePageState createState() => BIMHomePageState(viewModel: viewModel, platformSceneView: getPlatformSceneView());
}
class BIMHomePageState extends State<BIMHomePage> {
BIMHomePageState({this.viewModel, this.platformSceneView}) : super();
final BIMHomePageViewModelType viewModel;
final Widget platformSceneView;
@override
Widget build(BuildContext context) {
return Scaffold(
body: platformSceneView
);
}
}
class扩展StatefulWidget{
BIMHomePage({Key,this.viewModel}):super(Key:Key);
最终的BIMHomePageViewModelType视图模型;
小部件getPlatformSceneView(){
最终字符串viewType=“SceneView”;
if(Platform.isAndroid){
返回AndroidView(viewType:viewType);
}else if(Platform.isIOS){
返回UiKitView(viewType:viewType);
}否则{
返回中心(子项:文本(“不支持平台视图”);
}
}
@凌驾
BIMHomePageState createState()=>BIMHomePageState(viewModel:viewModel,platformSceneView:getPlatformSceneView());
}
类BIMHomePageState扩展了状态{
BIMHomePageState({this.viewModel,this.platformSceneView}):super();
最终的BIMHomePageViewModelType视图模型;
最终小部件平台SceneView;
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:platformSceneView
);
}
}
整个项目是一个弗兰肯斯坦应用程序,它包含了Native、Flatter、Kotlin多平台和SQLDelight,我只是出于好奇而制作的
任何帮助或想法都会令人惊讶的,谢谢
class BIMHomePage extends StatefulWidget {
BIMHomePage({Key key, this.viewModel}) : super(key: key);
final BIMHomePageViewModelType viewModel;
Widget getPlatformSceneView() {
final String viewType = "SceneView";
if (Platform.isAndroid) {
return AndroidView(viewType: viewType);
} else if (Platform.isIOS) {
return UiKitView(viewType: viewType);
} else {
return Center(child: Text("Platform view not supported"));
}
}
@override
BIMHomePageState createState() => BIMHomePageState(viewModel: viewModel, platformSceneView: getPlatformSceneView());
}
class BIMHomePageState extends State<BIMHomePage> {
BIMHomePageState({this.viewModel, this.platformSceneView}) : super();
final BIMHomePageViewModelType viewModel;
final Widget platformSceneView;
@override
Widget build(BuildContext context) {
return Scaffold(
body: platformSceneView
);
}
}