#flutter #android-intent #file-sharing
#flutter #android-намерение #общий доступ к файлам
Вопрос:
Я работаю над почтовым приложением, и я застрял, когда пытаюсь поделиться файлом, чтобы отправить его по электронной почте с пакетом receive_sharing_intent
Я могу получить файл в приложении с указанием его пути и всего остального, но затем мне нужно перенаправить пользователя на страницу редактора почты. Когда я пытаюсь использовать это, чтобы перейти на страницу mailEditor :
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MailEditor(
message: message,
editorType: 'new',
),
),
);
Я получаю эту ошибку :
[ОШИБКА: flutter /shell/common /shell.cc(213)] Ошибка Dart: необработанное исключение: запрошена операция навигатора в контексте, который не включает навигатор. Контекст, используемый для отправки маршрутов из навигатора, должен соответствовать контексту виджета, являющегося потомком виджета Navigator.
Этот пакет, разрабатываемый сообществом, я нигде не смог найти большой помощи в Интернете.
Мне не удалось использовать метод ReceiveSharingIntent где-либо еще, кроме основного файла.dart, так что, может быть, есть способ использовать его непосредственно на моей странице 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(),
},
);
}
Большое спасибо за любую помощь и предложения, я застрял на этом некоторое время.
Редактировать: добавлено больше кода для контекста
Ответ №1:
Навигатор следует использовать внутри build()
метода. Если вы хотите использовать context
вне его, передайте это в качестве аргумента, подобного BuildContext context
.
Комментарии:
1. Да, вы правы, и на самом деле это в методе сборки файла main.dart. Проблема в том, что намерения поделиться поступают извне приложения и напрямую вызывают этот метод, поэтому он не запускает приложение таким же образом, как я предполагаю, и это должно привести к тому, что контекст не будет готов, когда мне это нужно
2. @AnthonyD Действительно. Если вы находитесь в середине перехода виджета, то есть переходите туда или обратно, вы не можете вызвать navigator, потому что он находится в так называемом «плохом состоянии». setState и Navigator следует вызывать только после initState и перед dispose.
3. Это должно быть осуществимо в некотором смысле, это работает для gmail. Может быть, есть способ дождаться хорошего состояния, чтобы я мог вызвать навигатор?
4. @AnthonyD вы не ждете, пока состояние станет хорошим. Это должно выполняться при вызове setState. Например, настройка setState() внутри initState вызовет ошибку, поскольку функция initState предназначена для выполнения кода перед функцией сборки. Следовательно, вы не можете сказать приложению перестроить его еще до того, как оно будет построено. Кроме того, вызов setState при dispose бесполезен, поскольку выполненная сборка была удалена, и вы вызываете ее для восстановления. Если вы вызываете
_intentDataStreamSubscription
во время initState(), произойдет та же ошибка. Могу я попросить больше кода для контекста?5. Честно говоря, я не совсем понимаю, как пакет работает внутри, прямо сейчас я пытаюсь поделиться намерением, пока приложение находится в памяти (я сделаю не запущенную версию позже, если это сработает), поэтому метод сборки должен быть уже собран. Спасибо за ваше время, я добавил больше кода к вопросу!