【问题标题】:Flutter - Android app shows just a blank screenFlutter - Android 应用程序只显示一个空白屏幕
【发布时间】:2020-04-22 01:00:49
【问题描述】:

Android 应用只显示一个空白屏幕。下面是我的代码

import 'package:flutter/material.dart';
import 'package:camera/camera.dart';

import 'screens/home_screen.dart';

Future<void> main() async {
  final cameras = await availableCameras();
  final camera = cameras.first;

  runApp(MaterialApp(
    title: 'DEMO',
    theme: ThemeData(
      primarySwatch: Colors.blue,
    ),
    home: HomePage(
      title: 'DEMO',
      camera: camera,
    ),
  ));
}

错误信息

D/FlutterActivity( 3535): Using the launch theme as normal theme.
D/FlutterActivityAndFragmentDelegate( 3535): Setting up FlutterEngine.
D/FlutterActivityAndFragmentDelegate( 3535): No preferred FlutterEngine was provided. Creating a new FlutterEngine for this FlutterFragment.
D/FlutterActivityAndFragmentDelegate( 3535): Attaching FlutterEngine to the Activity that owns this Fragment.
D/FlutterView( 3535): Attaching to a FlutterEngine: io.flutter.embedding.engine.FlutterEngine@dccf1d3
D/FlutterActivityAndFragmentDelegate( 3535): Executing Dart entrypoint: main, and sending initial route: /
E/flutter ( 3535): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: ServicesBinding.defaultBinaryMessenger was accessed before the binding was initialized.
E/flutter ( 3535): If you're running an application and need to access the binary messenger before `runApp()` has been called (for example, during plugin initialization), then you need to explicitly call the `WidgetsFlutterBinding.ensureInitialized()` first.
E/flutter ( 3535): If you're running a test, you can call the `TestWidgetsFlutterBinding.ensureInitialized()` as the first line in your test's `main()` method to initialize the binding.
E/flutter ( 3535): #0      defaultBinaryMessenger.<anonymous closure> (package:flutter/src/services/binary_messenger.dart:76:7)
E/flutter ( 3535): #1      defaultBinaryMessenger (package:flutter/src/services/binary_messenger.dart:89:4)
E/flutter ( 3535): #2      MethodChannel.binaryMessenger (package:flutter/src/services/platform_channel.dart:140:62)
E/flutter ( 3535): #3      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:314:35)
E/flutter ( 3535): #4      MethodChannel.invokeListMethod (package:flutter/src/services/platform_channel.dart:335:40)
E/flutter ( 3535): #5      availableCameras (package:camera/camera.dart:81:10)
E/flutter ( 3535): #6      main (package:idocr/main.dart:8:25)
E/flutter ( 3535): #7      _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:239:25)
E/flutter ( 3535): #8      _rootRun (dart:async/zone.dart:1126:13)
E/flutter ( 3535): #9      _CustomZone.run (dart:async/zone.dart:1023:19)
E/flutter ( 3535): #10     _runZoned (dart:async/zone.dart:1518:10)
E/flutter ( 3535): #11     runZoned (dart:async/zone.dart:1502:12)
E/flutter ( 3535): #12     _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:231:5)
E/flutter ( 3535): #13     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:307:19)
E/flutter ( 3535): #14     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:174:12)
E/flutter ( 3535): 

【问题讨论】:

  • 你应该删除android标签,因为它在这里不相关。
  • 好吧,如果你删除你的异步函数它工作正常,所以我猜availableCameras() 无法返回
  • @wcyankees424 那么更新的代码是什么?
  • 从您的终端提供flutter doctor -v,以及您测试的设备
  • 您对此仍有疑问

标签: android flutter dart


【解决方案1】:

您必须像这样定义到您的HomePage 的路由

runApp(
    MaterialApp(
      title: 'DEMO',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(
        title: 'DEMO',
        camera: camera,
      ),
      routes: {
        HomePage.routeName: (ctx) => HomePage(),
      },
    ),
  );
}

然后在您的主页小部件中

class HomePage extends StatefulWidget {
  static const routeName = 'homePage'; 

如果你还需要什么,请告诉我

【讨论】:

  • 让我先试试
  • 这是否解决了您的问题?
  • 请检查我更新的问题以及给出的错误消息。
【解决方案2】:

我刚刚修好了。

import 'package:flutter/material.dart';
import 'package:camera/camera.dart';

import 'screens/home_screen.dart';

Future<void> main() async {

  WidgetsFlutterBinding.ensureInitialized();

  final cameras = await availableCameras();
  final camera = cameras.first;

  runApp(MaterialApp(
    title: 'OCR Demo',
    theme: ThemeData(
      primarySwatch: Colors.blue,
    ),
    home: HomePage(
      title: 'OCR Text Recognition',
      camera: camera,
    ),
  ));
}

【讨论】:

    【解决方案3】:

    您应该在调用 availableCameras 之前请求权限。这就是为什么屏幕是空白的。下面是我使用相机的代码。在调用 availableCameras 之前获取权限。还可以在 Flutter 应用中转到您的 android 清单文件并在那里添加权限。

    import 'package:permission_handler/permission_handler.dart';
    
    
    
      @override
      void initState() {
        super.initState();
        getPermissions();
      }
    
      
      Future getPermissions() async {
    
        Map<Permission, PermissionStatus> permissions =
        await [
          Permission.storage, Permission.camera, Permission.microphone
        ].request();
    
        if (permissions[Permission.storage] == PermissionStatus.granted &&
            permissions[Permission.camera] == PermissionStatus.granted &&
            permissions[Permission.microphone] == PermissionStatus.granted) {
    
          await getCameras();
    
        }
      }
    
     Future getCameras() async {
        cameras = await availableCameras();
        controller = CameraController(cameras[0], ResolutionPreset.high);
        controller.initialize().then((_) {
    
          /*if (!mounted) {
            return;
          }
          setState(() {});*/
    
          setState(() {
    
            isPermitted = true;
    
          });
    
    
        });
      }
    

    【讨论】:

    • 你能显示完整的代码吗?与我上面的问题相比,我认为这不是完整的代码。
    • 请检查我更新的问题以及给出的错误消息。
    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 2014-06-23
    相关资源
    最近更新 更多