#dart #flutter #dart-pub
#dart #flutter #dart-pub
Вопрос:
Я внедрил плагин Quick_actions в свой проект, и я хочу открыть определенный экран, но в функции обработчика quickaction навигатор не работает. при этом Try-Catch
исключение показывает, что контекст должен отображаться из навигатора, но я использую контекст navigatorKey моего приложения Material.
если я добавлю любую другую функцию, такую как print('some text')
, она работает, проблема возникает только при попытке использовать navigator
Создайте быстрые действия и добавьте функцию обработчика
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
сообщение)
Ответ №1:
В следующем примере использование MainView в quick action откроет виджет входа в систему, а прямое нажатие app откроет виджет 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')));
}
}