【问题标题】:Flutter Receive sharing intent and page changeFlutter 接收分享意图和页面变化
【发布时间】:2020-08-20 10:49:55
【问题描述】:

我正在开发一个邮件应用程序,但当我尝试与receive_sharing_intent package共享文件以通过电子邮件发送时遇到了问题

我可以在应用程序中获取文件及其路径和所有内容,但是我需要将用户重定向到邮件编辑器页面。当我尝试使用它进入邮件编辑器页面时:

Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => MailEditor(
            message: message,
            editorType: 'new',
          ),
        ),
      );

我收到此错误:

[ERROR:flutter/shell/common/shell.cc(213)] Dart 错误:未处理的异常: 使用不包含 Navigator 的上下文请求的 Navigator 操作。 用于从 Navigator 推送或弹出路由的上下文必须是作为 Navigator 小部件后代的小部件的上下文。

这个包是由社区开发的,我在互联网上的任何地方都找不到太多帮助。

我没有在 main.dart 文件之外的任何地方使用 ReceiveSharingIntent 方法,所以也许有一种方法可以直接在我的 mailEditor 页面上使用它,但我没有找到?

如果这里需要更多代码是我的 ReceiveSharingIntent 方法:

class MyApp extends StatefulWidget {
  // This widget is the root of your application.
  @override
  _MssProState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void dispose() {
    _intentDataStreamSubscription.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // For sharing images coming from outside the app while the app is in the memory
    _intentDataStreamSubscription = ReceiveSharingIntent.getMediaStream().listen((List<SharedMediaFile> value) {
      _sharedFiles = value;

      Message message = Message();
      for (var i = 0; i < _sharedFiles.length; i++) {
        File file = File(_sharedFiles[i].path);

        Attachment attachment = Attachment(
          fileName: basename(file.path),
          attachmentPart: i + 1,
          contentType: lookupMimeType(file.path),
          name: basename(file.path),
        );
      }

        Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => MailEditor(
            message: message,
            editorType: 'new',
          ),
        ),
      ); 
    });

    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Login(),
      routes: {
        '/login': (BuildContext context) => Login(),
      },
    );
  }

非常感谢您的任何帮助和建议,我已经坚持了一段时间。

编辑: 为上下文添加了更多代码

【问题讨论】:

    标签: flutter android-intent file-sharing


    【解决方案1】:

    导航器应在build() 方法中使用。如果您想在它之外使用context,请将其作为BuildContext context 之类的参数传递。

    【讨论】:

    • 是的,你是对的,实际上它在 main.dart 文件的 build 方法中。问题是共享意图来自应用程序外部,并直接调用此方法,因此它不会以我猜想的相同方式启动应用程序,这一定会导致上下文在我需要时没有准备好跨度>
    • @AnthonyD 确实。如果您处于 Widget 转换的中间,即来回转换,则不能调用 navigator,因为它处于所谓的“Bad State”状态。 SetState 和 Navigator 只能在 initState 之后和 dispose 之前调用。
    • 在某种程度上它必须是可行的,它确实适用于 gmail。或许有办法让我等好状态再打电话给导航器?
    • @AnthonyD 你不要等待状态好转。当您调用 setState 时,它​​必须这样做。例如,在 initState 中调用 setState() 会抛出错误,因为 initState 函数的目的是在构建函数之前执行代码。因此,您甚至不能在应用程序构建之前就对其进行重建。此外,在 dispose 上调用 setState 是没有用的,因为已进行的构建已被丢弃,而您正在调用它来重建。如果在 initState() 期间调用 _intentDataStreamSubscription,也会发生同样的错误。我可以要求更多代码吗?
    • 老实说,我真的不知道这个包是如何在内部工作的,现在我正试图在应用程序在内存中时分享意图(如果之后我会做非启动版本这确实有效)因此构建方法应该已经构建。感谢您的宝贵时间,我在问题中添加了更多代码!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2020-07-06
    • 2014-07-20
    • 1970-01-01
    • 2018-09-04
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多