- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在flutter项目之上创建一个android库以进行分发。我使用flutter开发了一个应用程序,但我想将其包装在Android库中。我一直收到错误消息Transform output file /Users/Dev/Documents/projects/LibExample/testlib/build/intermediates/flutter/flutter-x86.jar does not exist.
我已经阅读了几乎所有在线搜索内容,但到目前为止没有任何内容。LibExample
是我使用该库的示例应用程序,而testlib
是Android库。在testlib
中,我设置了build.graddle
来找到flutter.sdk
。我还指定了颤振源的位置。每当我sync
gradle文件时,都会收到错误/Users/Dev/Documents/projects/LibExample/testlib/build/intermediates/flutter/flutter-x86.jar不存在。
`
这是flutter doctor -v
的输出。
flutter doctor -v
[✓] Flutter (Channel beta, v0.5.2-pre.1, on Mac OS X 10.13.6 17G65, locale en-US)
• Flutter version 0.5.2-pre.1 at /Users/Dev/Downloads/flutter
• Framework revision 142e2f41ba (9 weeks ago), 2018-09-03 12:50:53 +0100
• Engine revision 1ed25ca7b7
• Dart version 2.0.0-dev.58.0.flutter-f981f09760
[✓] Android toolchain - develop for Android devices (Android SDK 28.0.3)
• Android SDK at /Users/Dev/Library/Android/sdk
• Android NDK location not configured (optional; useful for native profiling support)
• Platform android-28, build-tools 28.0.3
• Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)
• All Android licenses accepted.
[✓] iOS toolchain - develop for iOS devices (Xcode 10.1)
• Xcode at /Applications/Xcode.app/Contents/Developer
• Xcode 10.1, Build version 10B61
• ios-deploy 1.9.2
• CocoaPods version 1.5.3
[✓] Android Studio (version 3.2)
• Android Studio at /Applications/Android Studio.app/Contents
• Flutter plugin version 29.1.1
• Dart plugin version 181.5656
• Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)
[!] VS Code (version 1.28.0)
• VS Code at /Applications/Visual Studio Code.app/Contents
• Flutter extension not installed; install from
https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter
[✓] Connected devices (1 available)
• Android SDK built for x86 • emulator-5554 • android-x86 • Android 5.1.1 (API 22) (emulator)
! Doctor found issues in 1 category.
最佳答案
我最终在一个颤抖的维基page上偶然发现了此功能。
撰写本文时要注意的一件非常重要的事情;
“ add2app”支持处于预览状态,到目前为止仅在主频道上可用。
尽管此功能仍处于试验阶段,但可以正常工作(很少遇到这种情况,例如从Android主机调用时启动flutter应用程序所需的时间)。
使用flutter create xxx
创建的Flutter项目包括用于Flutter / Dart代码的非常简单的宿主应用程序(单个Activity Android宿主和单个ViewController iOS宿主)。您可以修改这些主机应用程序以适合您的需求并从那里构建。
但是,如果您要从任一平台的现有主机应用程序开始,则可能需要将Flutter项目作为某种形式的库包含在该应用程序中。
这就是Flutter模块模板所提供的。执行flutter create -t module xxx
会产生一个Flutter项目,其中包含一个Android库和一个Cocoapods Pod,供您的现有主机应用程序使用。
安卓系统
创建Flutter模块
假设您在some / path / MyApp上有一个现有的Android应用程序,并且希望Flutter项目作为同级项目:
$ cd some/path/
$ flutter create -t module my_flutter
some/path/my_flutter/
Flutter模块项目,其中包含一些Dart代码以帮助您入门,以及一个
.android/
隐藏的子文件夹,该文件夹将模块项目包装在Android库中。
$ cd .android/
$ ./gradlew flutter:assembleDebug
flutter-debug.aar
中生成一个
.android/Flutter/build/outputs/aar/.
存档文件
settings.gradle
中:
// MyApp/settings.gradle
include ':app' // assumed existing content
setBinding(new Binding([gradle: this])) // new
evaluate(new File( // new
settingsDir.parentFile, // new
'my_flutter/.android/include_flutter.groovy' // new
)) // new
include
(作为
:flutter
)以及该模块使用的任何Flutter插件(例如
:package_info
,
:video_player
等)在您的
settings.gradle
评估上下文中。
implementation
依赖项:
// MyApp/app/build.gradle
:
dependencies {
implementation project(':flutter')
:
}
Flutter.createView
来完成:
// MyApp/app/src/main/java/some/package/MainActivity.java
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
View flutterView = Flutter.createView(
MainActivity.this,
getLifecycle(),
"route1"
);
FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(600, 800);
layout.leftMargin = 100;
layout.topMargin = 200;
addContentView(flutterView, layout);
}
});
FlutterFragment
来单独负责生命周期的工作:
// MyApp/app/src/main/java/some/package/SomeActivity.java
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
tx.replace(R.id.someContainer, Flutter.createFragment("route1"));
tx.commit();
}
});
"route1"
告诉Dart代码在Flutter视图中显示哪个窗口小部件。 Flutter模块项目模板的
lib/main.dart
文件应位于(或以其他方式解释)所提供的路由字符串(可作为
switch
使用)上的
window.defaultRouteName
,以确定要创建并传递给
runApp
的小部件。示意地
import 'dart:ui';
import 'package:flutter/material.dart';
void main() => runApp(_widgetForRoute(window.defaultRouteName));
Widget _widgetForRoute(String route) {
switch (route) {
case 'route1':
return SomeWidget(...);
case 'route2':
return SomeOtherWidget(...);
default:
return Center(
child: Text('Unknown route: $route', textDirection: TextDirection.ltr),
);
}
}
MyApp
的方式与添加Flutter模块依赖项之前的方式完全相同,通常使用Android Studio。编辑,调试和分析Android代码也是如此。
$ cd some/path/my_flutter
$ flutter attach
MyApp
(或您通常采用的任何一种方式)。导航到使用Flutter的应用程序区域。然后回到终端,您应该看到类似于以下内容的输出:
Done.
Syncing files to device Nexus 5X... 5.1s
🔥 To hot reload changes while running, press "r". To hot restart (and rebuild state), press "R".
An Observatory debugger and profiler on Nexus 5X is available at: http://127.0.0.1:59556/
For a more detailed help message, press "h". To quit, press "q".
my_flutter
中编辑Dart代码,并且可以通过在终端中按
r
来热加载更改。您也可以将上面的URL粘贴到浏览器中,以使用Dart Observatory设置断点,分析内存保留和其他调试任务。
some/path/MyApp
上有一个现有的iOS应用程序,并且希望Flutter项目作为同级项目:
$ cd some/path/
$ flutter create -t module my_flutter
some/path/my_flutter/
Flutter模块项目,其中包含一些Dart代码以帮助您入门,以及一个
.ios/
隐藏的子文件夹,该文件夹包含包含一些Cocoapods和一个辅助Ruby脚本的模块项目。
.xcconfig
文件,则可以重用它们,但是可能需要相应地调整下面提到的一些相对路径。
some/path/
my_flutter/
lib/main.dart
.ios/
MyApp/
MyApp/
AppDelegate.h
AppDelegate.m (or swift)
:
MyApp
)已在使用Cocoapods,则只需执行以下操作即可与您的
my_flutter
应用程序集成:
Podfile
:
flutter_application_path = 'path/to/flutter_app/'
eval(File.read(File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')), binding)
pod install
。
some/path/my_flutter/pubspec.yaml
中更改Flutter插件依赖项时,都需要运行从
some/path/my_flutter
获取的flutter软件包以刷新
podhelper.rb
脚本读取的插件列表。然后从
some/path/MyApp
再次运行pod install。
MyApp
项目。在主视图的左侧选择TARGET
MyApp
,然后选择
Build Phases
选项卡。通过单击主视图左上方的
+
,添加一个新的构建阶段。选择
New Run Script
相位。展开新的
Run Script
,将其添加到阶段列表中。
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed
⌘B
构建项目。
Flutter.framework
(引擎库)已嵌入到您的
App.framework
(您的Flutter应用程序二进制文件)已嵌入
flutter_assets
文件夹将作为资源嵌入-它
FlutterAppDelegate
的子类。
AppDelegate.h
中:
#import <UIKit/UIKit.h>
#import <Flutter/Flutter.h>
@interface AppDelegate : FlutterAppDelegate
@end
AppDelegate.m
变得非常简单,除非您的宿主应用需要在此处覆盖其他方法:
#import <FlutterPluginRegistrant/GeneratedPluginRegistrant.h> // Only if you have Flutter Plugins
#include "AppDelegate.h"
@implementation AppDelegate
// This override can be omitted if you do not have any Flutter Plugins.
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end
AppDelegate.swift:
中执行以下操作
import UIKit
import Flutter
import FlutterPluginRegistrant // Only if you have Flutter Plugins.
@UIApplicationMain
class AppDelegate: FlutterAppDelegate {
// Only if you have Flutter plugins.
override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
GeneratedPluginRegistrant.register(with: self);
return super.application(application, didFinishLaunchingWithOptions: launchOptions);
}
}
#import <Flutter/Flutter.h>
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self
action:@selector(handleButtonAction)
forControlEvents:UIControlEventTouchUpInside];
[button setTitle:@"Press me" forState:UIControlStateNormal];
[button setBackgroundColor:[UIColor blueColor]];
button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
[self.view addSubview:button];
}
- (void)handleButtonAction {
FlutterViewController* flutterViewController = [[FlutterViewController alloc] init];
[self presentViewController:flutterViewController animated:false completion:nil];
}
@end
ViewController.swift:
import UIKit
import Flutter
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton(type:UIButtonType.custom)
button.addTarget(self, action: #selector(handleButtonAction), for: .touchUpInside)
button.setTitle("Press me", for: UIControlState.normal)
button.frame = CGRect(x: 80.0, y: 210.0, width: 160.0, height: 40.0)
button.backgroundColor = UIColor.blue
self.view.addSubview(button)
}
@objc func handleButtonAction() {
let flutterViewController = FlutterViewController()
self.present(flutterViewController, animated: false, completion: nil)
}
}
[flutterViewController setInitialRoute:@"route1"];
flutterViewController.setInitialRoute("route1")
FlutterViewController
之后(并在展示之前)立即使用。
SystemNavigator.pop()
来关闭Flutter应用。
$ cd some/path/my_flutter
$ flutter attach
Waiting for a connection from Flutter on iPhone X...
MyApp
。导航到使用Flutter的应用程序区域。然后回到终端,您应该看到类似于以下内容的输出:
Done.
Syncing files to device iPhone X... 4.7s
🔥 To hot reload changes while running, press "r". To hot restart (and rebuild state), press "R".
An Observatory debugger and profiler on iPhone X is available at: http://127.0.0.1:54741/
For a more detailed help message, press "h". To quit, press "q".
my_flutter
中编辑Dart代码,并且可以通过在终端中按
r
来热加载更改。您也可以将上面的URL粘贴到浏览器中,以使用Dart Observatory设置断点,分析内存保留和其他调试任务。
root isolates
)的多个实例。
flutter attach
默认情况下连接到所有可用的隔离。然后,将从附加的CLI发送的所有命令转发到每个附加的隔离。
l
CLI工具中键入
flutter
列出所有附加的隔离株。如果未指定,将从dart入口点文件和函数名称自动生成隔离名称。
l
输出:
Connected views:
main.dart$main-517591213 (isolates/517591213)
main.dart$main-332962855 (isolates/332962855)
// main.dart
import 'dart:ui' as ui;
void main() {
ui.window.setIsolateDebugName("debug isolate");
// ...
}
flutter attach
选项运行
--isolate-filter
。
$ flutter attach --isolate-filter='debug'
Waiting for a connection from Flutter...
Done.
Syncing files to device... 1.1s
🔥 To hot reload changes while running, press "r". To hot restart (and rebuild state), press "R".
An Observatory debugger and profiler is available at: http://127.0.0.1:43343/
For a more detailed help message, press "h". To detach, press "d"; to quit, press "q".
Connected view:
debug isolate (isolates/642101161)
关于android - 在Flutter项目上创建Android库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53164519/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!