我正处于学习Dart和Flutter的早期阶段。我正在研究如何实现eventbus,它工作正常,但我注意到小部件(和/或它们的关联状态)持有对(全局) eventbus 的强引用,导致内存泄漏。解决方案是在小部件状态的 dispose 方法中取消订阅,但我想知道是否有更好的方法(我来自 Swift,它允许将变量声明为“弱”)。
编辑
我最终将状态子类化如下......还有更好的建议吗?
abstract class CustomState<T extends StatefulWidget> extends State {
List<StreamSubscription> eventSubscriptions = [];
void subscribeToEvent(Object eventClass, Function callback) {
StreamSubscription subscription = eventBus.on(eventClass).listen(callback);
eventSubscriptions.add(subscription);
}
void dispose() {
super.dispose();
eventSubscriptions.forEach((subscription) => subscription.cancel());
eventSubscriptions = null;
}
}
class MyEvent {
String text;
MyEvent(this.text);
}
class _MyHomePageState extends CustomState<MyHomePage> {
@override
void initState() {
super.initState();
subscribeToEvent(MyEvent, onEventFired);
}
void onEventFired(event) {
print('event fired: ${event.runtimeType} ${event.text}');
}
}
Run Code Online (Sandbox Code Playgroud) memory-leaks weak-references circular-reference dart flutter
假设我们有一个空的父部件(一个容器),没有大小,并且绝对定位(在它自己的父部件内)在上/左(x/y)坐标处。然后我们将一个子部件(具有可变大小,事先未知)放置在父部件中。有没有办法将子项定位在其自身宽度的-50%处,使得子项的水平中心出现在其父项的x坐标处?我不想使用全局键,因为会有数百个实例。我尝试过 Transform.translate (只接受已知的 x 偏移量)、FractionalOffsets、FractionallySizedBoxes、Alignments 等,但似乎没有任何效果可以实现我想要实现的目标。有谁知道解决方案吗?
我正在开发一个跨平台增强现实库,我的 Android 代码运行良好,但我在 iOS 上遇到了问题。我正在使用 Android 的TYPE_ROTATION_VECTOR传感器,它会生成SensorEvent。此事件返回一个包含 5 个值的数组(如此处所述),这些值用于生成旋转矩阵(使用此方法)。我只对前 4 个值感兴趣。它们被描述为:
\n\n\nSensorEvent.values[0] x *sin(\xce\xb8/2)
\nSensorEvent.values[1] y *sin(\xce\xb8/2)
\nSensorEvent.values[2] z *sin(\xce\xb8/2)
\nSensorEvent.values[3] cos(\xce\xb8/2)
\n
上述链接继续说
\n\n\n旋转矢量传感器 (TYPE_ROTATION_VECTOR) 以单位四元数的形式提供设备相对于地球坐标系的方向。具体来说,旋转矢量将设备的方向表示为角度和轴的组合,其中设备绕轴 < x , y\n, z > 旋转了角度 \xce\xb8 。旋转向量的前四个元素等于单位四元数 x sin(\xce\xb8/2)、y sin(\xce\xb8/2)、z\n*sin(\xce\xb8 /2)>. 旋转向量的元素是无单位的。
\n
iOS 中的 CoreMotion 提供了四元数读取,但它似乎与 Android 的 TYPE_ROTATION_VECTOR 值没有关联(至少不是直接关联)。我也尝试过 deviceMotionattitude.rotationMatrix直接尝试过deviceMotion的值,但没有用。
所以我的问题是:在iOS中,如何获得相当于Android的TYPE_ROTATION_VECTOR的传感器值?
\nFlutter 的AnimatedSize类根据其子项的大小对其大小进行动画处理。我需要知道如何监听大小的变化,最好是在调整大小完成后。
在我的用例中,这个小部件包含在ListView 中,但我似乎只能使用NotificationListener来监听滚动事件(能够监听可滚动高度的变化可以解决我的问题)。
或者,能够在诸如Column之类的小部件更改其子项数量时进行侦听也可以。
我正在使用FlutterDriver对Flutter包执行集成测试。
平台为Android时,脚手架中使用AppBar,平台为iOS时,使用CupertinoNavigationBar。
在Android上测试时,我可以找到带有以下代码的后退按钮
await driver.tap(find.byTooltip('Back'));
Run Code Online (Sandbox Code Playgroud)
但是,这在 iOS 上失败了。由于按钮是自动生成的,我无法以编程方式添加标签。关于如何在 iOS 上选择它的任何建议?跨平台解决方案的奖励积分。
另外,对于模拟 android 设备后退按钮点击(在应用程序之外)有什么建议吗?
我正在学习 Flutter 的计算功能。我的理解是,它是为了将计算量大的工作卸载到另一个线程,以免阻塞 UI 线程。我遇到了一些我不太理解的行为。考虑下面的应用程序。
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
void main() => runApp(new MyApp());
class StringValues {
static String foo = 'Foo';
static String bar;
}
String _calculate(String value) {
return value + ' ' + (StringValues.foo ?? 'undefined') + ' ' + (StringValues.bar ?? 'undefined');
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
} …Run Code Online (Sandbox Code Playgroud)