首页 > 解决方案 > 如何在flutter中使用quick_actions官方插件打开特定屏幕?

问题描述

我在我的项目中实现了Quick_actions插件,我想打开一个特定的屏幕,但在快速操作处理程序函数中,导航器不起作用。丝毫Try-Catch,异常表明上下文显示来自导航器,但我使用的是我的 MaterialApp 的 navigatorKey 的上下文。

如果我放置任何其他功能,例如print('some text')它可以工作,则问题仅在我尝试使用导航器时发生

创建快速操作并添加处理函数

createQuickActions() {
    quickActions.initialize(
      (String shortcutId) {
        switch (shortcutId) {
          case 'settings':
            try {
              Navigator.push(
                MyApp.navigatorKey.currentContext,
                MaterialPageRoute(
                  builder: (context) => SettingsScreen(sistemas),
                ),
              );
            } catch (e) {
              print(e);
            }
            print('selected: $shortcutId');
          break;
        }
      }
    );
  }

初始化快速动作

 quickActions.setShortcutItems(
      <ShortcutItem>[
        const ShortcutItem(
          type: 'settings',
          localizedTitle: 'settings',
          icon: 'settings',
        ),
     ],
   );

所有这些代码都在我的,SplashScreen因为插件的文档说应该处于应用程序的早期状态

我希望应用程序打开settings screenprint 'settings'但它会打开main screenprint 'settings'如果应用程序已经打开,但如果不是,它会尝试打开某些东西然后关闭自身(不是force close消息)

标签: dartflutterdart-pub

解决方案


在下面的例子中,在快速操作中使用 MainView 将打开 Login 小部件,直接单击应用将打开 Home 小部件

您可以参考https://www.filledstacks.com/snippet/managing-quick-actions-in-flutter/了解详情

完整代码

import 'package:flutter/material.dart';
import 'package:quick_actions/quick_actions.dart';
import 'dart:io';

class QuickActionsManager extends StatefulWidget {
  final Widget child;
  QuickActionsManager({Key key, this.child}) : super(key: key);

  _QuickActionsManagerState createState() => _QuickActionsManagerState();
}

class _QuickActionsManagerState extends State<QuickActionsManager> {
  final QuickActions quickActions = QuickActions();

  @override
  void initState() {
    super.initState();
    _setupQuickActions();
    _handleQuickActions();
  }

  @override
  Widget build(BuildContext context) {
    return widget.child;
  }

  void _setupQuickActions() {
    quickActions.setShortcutItems(<ShortcutItem>[
      ShortcutItem(
          type: 'action_main',
          localizedTitle: 'Main view',
          icon: Platform.isAndroid ? 'quick_box' : 'QuickBox'),
      ShortcutItem(
          type: 'action_help',
          localizedTitle: 'Help',
          icon: Platform.isAndroid ? 'quick_heart' : 'QuickHeart')
    ]);
  }

  void _handleQuickActions() {
    quickActions.initialize((shortcutType) {
      if (shortcutType == 'action_main') {
        Navigator.push(
            context, MaterialPageRoute(builder: (context) => Login()));
      } else if(shortcutType == 'action_help') {
        print('Show the help dialog!');
      }
    });
  }

}

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'QuickActions Demo', home: QuickActionsManager(child: Home()));
  }
}

class Home extends StatelessWidget {
  const Home({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(body: Center(child: Text('Home')));
  }
}

class Login extends StatelessWidget {
  const Login({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(body: Center(child: Text('Login')));
  }
}

在此处输入图像描述


推荐阅读