В моем main.dart есть две функции верхнего уровня, которые вызывают runApp()
, каждый из которых запускает разные MaterialApp. Можно вызвать указанную функцию верхнего уровня, когда flutter run
?
вот полный код main.dart:
// top-level that i want to use in `flutter run`
@pragma('vm:entry-point')
void text2Image() {
runApp(const OtherApp());
}
// default top-level
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await P.init();
runApp(const MainApp());
}
Информация о версии флаттера:
[✓] Flutter (Channel stable, 3.22.3, on macOS 14.4 23E214 darwin-arm64, locale zh-Hans-CN)
• Flutter version 3.22.3 on channel stable at /Users/acidtar/flutter
• Upstream repository https://github.com/flutter/flutter.git
• Framework revision b0850beeb2 (5 weeks ago), 2024-07-16 21:43:41 -0700
• Engine revision 235db911ba
• Dart version 3.4.4
• DevTools version 2.34.3
• Pub download mirror https://pub.flutter-io.cn
• Flutter download mirror https://storage.flutter-io.cn
возможно, flutter run
с каким-то аргументом сможет вызывать другую функцию верхнего уровня и показывать другое приложение
Судя по обсуждению в соответствующем выпуске GitHub, указание нескольких точек входа должно сработать. Тем не менее, вам необходимо пометить все возможные точки входа в одном файле, а затем добавить условную логику на каждой собственной платформе для правильной обработки точки входа. Связанная проблема GitHub предоставляет пример кода того, как это сделать для Android.
Я предлагаю использовать переменные среды Dart (--dart-define<...>
) или, что лучше, разделить функции точки входа на разные файлы точек входа.
Чтобы указать переменную среды, укажите флаг --dart-define
с именем и значением переменной. Затем внутри единой точки входа вы можете прочитать эту переменную из среды и выполнить условный запуск приложения:
flutter run --dart-define=TEXT_TO_IMAGE=true
void main() async {
const runOtherApp = bool.fromEnvironment(
'TEXT_TO_IMAGE',
defaultValue: false,
);
if (runOtherApp) {
runApp(const OtherApp());
} else {
WidgetsFlutterBinding.ensureInitialized();
await P.init();
runApp(const MainApp());
}
}
Определение переменной среды доступно как для команд flutter build
, так и для flutter run
.
Как только ваша другая точка входа вырастет и потребует специальной инициализации, лучше всего разделить точки входа на отдельные файлы. Приложение по умолчанию может остаться в файле main.dart
, а альтернативное приложение можно извлечь в text_to_image_main.dart
(имя зависит от вас). Затем вы можете указать флаг -t
с путем к файлу точки входа:
flutter run -t lib/text_to_image_main.dart
В этом случае запуск команд CLI флаттера без флага -t
запустит точку входа по умолчанию (main.dart
).
Я определил две функции входа для кода Swift: запустите другое приложение. По вашему предложению, я разделил точку входа в другой файл в соответствии с этим ответом, используя
flutterEngine.run(withEntrypoint: "text2Image")
Swift RunflutterEngine.run(withEntrypoint: "textToImageMain", libraryURI: "package:package_name/text_to_image_main.dart")
text_to_image_main.dart
в качестве точки входа. спасибо еще раз