dart - 如何在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 screen
,print 'settings'
但它会打开main screen
,print 'settings'
如果应用程序已经打开,但如果不是,它会尝试打开某些东西然后关闭自身(不是force close
消息)
解决方案
在下面的例子中,在快速操作中使用 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')));
}
}
推荐阅读
- swiftui - 如何从 SwiftUI 中的 apns 点击导航到某些视图?
- python - SkImage 中 cv2.INTER_AREA 的等价物
- node.js - 为节点 js 中的每个用户运行计划功能
- javascript - 通过 selft 内的 settimeout 参数重复函数
- postman - 如何在发布请求中创建数据时传递 API 密钥
- loadrunner - UFT 与 LoadRunner 的集成
- reactjs - react-beautiful-dnd - 如果存在超过 4 个列表,则在下一行添加列表
- c++ - VS2019 - 使用 Cmake 项目在 Linux 上进行 Sudo 远程调试
- regex - 如果数字有元素 2、4 或 8,如何制作一个输出拍手的函数?
- windows - Windows 设备驱动程序可以有依赖项吗?