Как удалить экран Flutter из собственного кода iOS с помощью вызова метода канала?IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как удалить экран Flutter из собственного кода iOS с помощью вызова метода канала?

Сообщение Anonymous »


Я учусь интегрировать Flutter в собственные приложения для iOS. До сих пор мне удавалось переходить к экранам Flutter из iOS View, но я застрял, закрывая экран Flutter, используя метод, описанный в разделе «Использование каналов платформы» на https://docs.flutter.dev/. интеграция платформы/платформенные каналы?tab=ios-channel-swift-tab.

В этом примере используется приложение Flutter, которое взаимодействует с базовой собственной платформой, поэтому в AppDelegate.swift FlutterMethodChannel и setMethodCallHandler получает вызов метода и выполняет желаемую собственную логику.

В примере по адресу https://docs.flutter.dev/add-to-app/ios/project-setup и следующем по адресу https://docs.flutter.dev/add-to-app/ios/add. -flutter-screen?tab=entrypoint-library-swift-tab#dart-library Вместо этого Flutter интегрирован как модуль, поэтому нет AppDelegate.swift для обработки FlutterMethodChannel и вызовы методов в качестве модулей используют только obj-c и создают AppDelegate.h и AppDelegate.m.

Я пытался создать AppDelegate.swift вручную, но затем при import Flutter произошел сбой без такой ошибки модуля.

Поэтому я попытался создать его для собственного приложения iOS, поскольку я создал приложение SwiftUI для тестирования процесса, и импорт Flutter не выдает ошибок, поскольку Flutter действительно является установленным модулем, но затем я получаю Thread 1: Swift сбой во время выполнения: принудительно развернуло исключение с нулевым значением при развертывании window?.rootViewController.

Моя идея — вызвать controller.dismiss(animated:true).

Я хожу кругами, потому что я немного заржавел в Swift. Можете ли вы заметить, что я делаю не так?

Большое спасибо.

Метод уведомления Flutter to Swift:

import 'package:flutter/services.dart'; класс Утилиты { статическая пустота closeFlutterView() { // Канал платформы для уведомления Swift константный канал MethodChannel = MethodChannel('com.example/close_flutter_view'); канал.invokeMethod('закрыть'); } } Двигающийся экран:

import 'dart:io'; импортировать «пакет: флаттер/cupertino.dart»; импортировать «пакет: флаттер/материал.dart»; импортировать «пакет: flutter_module/utilities.dart»; @pragma('vm:точка входа') недействительный экранAEntrypoint() { runApp(const MaterialApp( дома: ScreenA(), )); } // @pragma('vm:entry-point') класс ScreenA расширяет StatefulWidget { const ScreenA({super.key}); @переопределить State createState() => _ScreenAState(); } класс _ScreenAState расширяет State { динамическая задняя кнопка = Platform.isIOS? CupertinoIcons.back : Icons.arrow_back; @переопределить Сборка виджета (контекст BuildContext) { вернуть эшафот( AppBar: AppBar( заголовок: const Text("Экран А"), ведущий: IconButton( значок: Значок (backButton), цвет: Colors.redAccent, onPressed: () { Утилиты.closeFlutterView(); }), ), body: const Text("Точка входа на экран А"), ); } } Основной файл Swift:

импортировать SwiftUI импортировать флаттер импорт FlutterPluginRegistrant // Создаём движок Flutter класс FlutterDependency: ObservableObject { let flutterEngine = FlutterEngine(name: «мой флаттер-движок»); let flutterEngine2 = FlutterEngine(name: «мой флаттер-движок 2»); в этом(){ flutterEngine.run(withEntrypoint: «screenAEntrypoint», LibraryURI: «пакет: flutter_module/screen_a.dart»); flutterEngine2.run(withEntrypoint: «screenBEntrypoint», LibraryURI: «пакет: flutter_module/screen_b.dart»); GeneratedPluginRegistrant.register(с: self.flutterEngine); GeneratedPluginRegistrant.register(с: self.flutterEngine2); } } @основной struct flutter_integration_testApp: Приложение { @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate @StateObject var flutterDependities = FlutterDependologies() var body: некоторая сцена { ОкноГруппа { ContentView().environmentObject(flutterDependities) } } } Основной вид Swift:

импортировать SwiftUI импортировать CoreData импортировать флаттер структура ContentView: Просмотр { // Зависимости Flutter передаются в EnvironmentObject. @EnvironmentObject var flutterDependities: FlutterDependities var body: some View { Текст("Просмотр iOS") Button("Показать флаттер!") { шоуФлаттер() } Button("Показать Flutter2!") { шоуФлаттер2() } } функция showFlutter() { // Получаем RootViewController. сторожить пусть windowScene = UIApplication.shared.connectedScenes .first(где: { $0.activationState == .foregroundActive && $0 — это UIWindowScene }) как? UIWindowScene, пусть окно = windowScene.windows.first(где: \.isKeyWindow), пусть rootViewController = window.rootViewController еще {возврат} // Создаем FlutterViewController. пусть flutterViewController = FlutterViewController( движок: flutterDependency.flutterEngine, имя пера: ноль, комплект: ноль) flutterViewController.modalPresentationStyle = .overCurrentContext flutterViewController.isViewOpaque = false rootViewController.present(flutterViewController, анимированный: true) } функция showFlutter2() { // Получаем RootViewController. сторожить пусть windowScene = UIApplication.shared.connectedScenes .first(where: {$0.activationState == .foregroundActive && $0 is UIWindowScene }) как? UIWindowScene, пусть окно = windowScene.windows.first(где: \.isKeyWindow), пусть rootViewController = window.rootViewController еще {возврат} // Создаем FlutterViewController. пусть flutterViewController = FlutterViewController( движок: flutterDependologies.flutterEngine2, имя пера: ноль, комплект: ноль) flutterViewController.modalPresentationStyle = .overCurrentContext flutterViewController.isViewOpaque = false rootViewController.present(flutterViewController, анимированный: true) } } AppDelegate.swift:
импортировать фундамент импортировать UIKit импортировать флаттер класс AppDelegate: NSObject, UIApplicationDelegate { func application (_ application: UIApplication, DidFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { print("Ваш код здесь") пусть windowScene = UIApplication.shared.connectedScenes .first(where: {$0.activationState == .foregroundActive && $0 is UIWindowScene }) как? UIWindowScene; пусть окно = windowScene?.windows.first(где: \.isKeyWindow); пусть контроллер: FlutterViewController = окно?.rootViewController как! Флаттервиевконтроллер; let flutterChannel = FlutterMethodChannel(name: "com.example/close_flutter_view", binaryMessenger: контроллер.binaryMessenger) flutterChannel.setMethodCallHandler({ (вызов: FlutterMethodCall, результат: @escaping FlutterResult) -> Пустота в Guard call.method == "закрыть" else { результат (FlutterMethodNotImplemented) возвращаться } контроллер.отклонить (анимированный: правда); }) вернуть истину } }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»