我正在建立一个扑朔迷离的游戏。我有大约130-150mo的图片。而且其中一些必须预先加载,否则用户体验会不流畅。
我自己发现了一种预加载图像的方法:
final asset = new ExactAssetImage(assetPath);
final stream = asset.resolve(createLocalImageConfiguration(context));
Run Code Online (Sandbox Code Playgroud)
虽然这样做有效,但存在一个巨大的缺点:内存成本大约是实际图像大小的6倍。
结果呢?我的应用程序仅通过加载图像就消耗了800 MO的内存,这太疯狂了(特别是考虑到它是一个相对简单的应用程序)。实际上,公羊的消耗是如此之大,以至于我丢失了很多框架。
简而言之:预加载图像的最理想方法是什么?有什么我想念的吗?
我处于一种情况,我想使用Proxy, 在类列表之间“负载平衡”。
我想做的一个简单的例子如下:
class Foo {
constructor(private msg: string) {}
foo() {
console.log(this.msg);
}
}
// @ts-ignore
const proxy: Foo = new Proxy([new Foo('foo'), new Foo('bar')], {
get: (o, key) => {
const client = o[Math.floor(Math.random() * o.length)];
console.log(client, key);
return client[key];
},
});
proxy.foo();
Run Code Online (Sandbox Code Playgroud)
这“有效”。问题是我正在使用打字稿。而且,由于Proxy类型定义,我们不能做类似的事情
new Proxy<Foo>([new Foo(), new Foo()], handler)
Run Code Online (Sandbox Code Playgroud)
因为它会产生以下错误:
“Foo[]”类型的参数不可分配给“Foo”类型的参数。
有没有办法实现这一点;不丢失类型检查?
希望我能说清楚。
在观看视频和教程之后,我发现这种方式使一些小部件可以将数据输入到块(valueSetting)中,而另一些小部件可以将数据输入(值)中。
我要问的是,是否有更好的方法(必须)。我想避免在小部件之间只共享1个实际值的4个变量。
import 'dart:async';
import 'package:rxdart/subjects.dart';
class BlocExample {
final _valueSettingController = StreamController<bool>();
// object use by widget to push data
Sink<bool> get valueSetting => _valueSettingController.sink;
final _value = BehaviorSubject<bool>(seedValue: false);
// object used by widget to get data
Stream<bool> get value => _value.stream;
BlocExample() {
_valueSettingController.stream.listen(_value.add);
}
void dispose() {
_value.close();
_valueSettingController.close();
}
}
Run Code Online (Sandbox Code Playgroud) 考虑一个PageView用法,其中我们有一个PageView在另一个里面:
PageView(
children: [
Container(color: Colors.red),
Column(
children: [
Text('Title'),
PageView(
children: [
Container(color: Colors.green),
Container(color: Colors.yellow),
],
),
],
)
],
);
Run Code Online (Sandbox Code Playgroud)
这种架构将允许我们在外部PageView和内部PageView之间转换。但是一旦我们到达内部的PageView,我们就无法再出去了。
这是一个展示它的gif:
在这样的架构中,我们不能将两个PageView都“合并”为一个,因为内部的PageView不会填满屏幕
我们如何在允许从两个PageView转换而不会卡住的情况下获得类似的结果?
我目前正在为我的下一个项目寻找一个Web框架,由于某些原因,我对角镖感兴趣.
但与此同时,我希望我的webapp遵循PWA指南.
我搜索了很多,但我还没有在angulardart中找到PWA的例子.我看到了JS对应的一些例子或者发现了pwadart包,但是我缺乏angulardart框架的知识来知道它是否可能在dart中.
那么,是否有可能在angulardart中制作PWA?
我最近遇到了这个问题,如何解决Flutter中的“断言失败:布尔表达式不能为null”异常
问题出在哪里,应该是被视为有效的无效代码。
这段代码可以总结为:
int stuff;
if (stuff = null) { // = instead of ==
}
Run Code Online (Sandbox Code Playgroud)
但是为什么要编译此代码?如下将不会。
int stuff;
if (stuff = 42) {
}
Run Code Online (Sandbox Code Playgroud)
伴随以下编译错误:
条件必须具有静态的“布尔”类型。
因此,我可能会出于一致性考虑if (stuff = null)而产生相同的错误。
在开发过程中调试应用程序的一种快速方法是编写如下语句:
print($data)
Run Code Online (Sandbox Code Playgroud)
有没有办法在切换到生产模式时停止打印,这样它就不会影响应用程序的性能?
例如,布尔值作为开关?
我的应用程序中有以下代码:
expect(() => dataSource.getLastPost(), throwsA(TypeMatcher<CacheException>()));
Run Code Online (Sandbox Code Playgroud)
这导致以下错误
Expected: throws <Instance of 'TypeMatcher<CacheException>'>
Actual: <Closure: () => Future<PostModel>>
Which: threw <Instance of 'CacheException'>
Run Code Online (Sandbox Code Playgroud)
如果我删除包装 CacheException 的 TypeMatcher ...
expect(() => dataSource.getLastPost(), throwsA(CacheException()));
Run Code Online (Sandbox Code Playgroud)
然后它仍然给出类似的错误
Expected: throws <Instance of 'CacheException'>
Actual: <Closure: () => Future<PostModel>>
Which: threw <Instance of 'CacheException'>
Run Code Online (Sandbox Code Playgroud)
我想知道我做错了什么?无论哪种方式,很明显我们期待 CacheException 并且正在抛出 CacheException。那为什么expect测试没有通过呢?
我有一个BLoC,它使用原始输入Stream(产生JSON对象列表)并将其转换为使用的可用对象StreamTransformer。UI将显示该列表。用户可以应用过滤器(本身是流到BLoC中的流),以便BLoC用相应的where(...)语句更新输入流转换器。
问题是:当过滤器更改时,UI不会更新,因为输出流取决于JSON输入流(而不是过滤器流)的事件。我的假设是我需要创建自己的流,将输入事件和过滤器事件都转发到该流中,或者我需要在转换后的输入流上重复最后一个事件,以便转换器有机会将其拾取。如何正确完成?一个例子会很有帮助!
如何State在Flutter中热重载子类的字段?
我知道在热重装期间不考虑修改字段的初始值,并且可以对它们使用热重装。但这非常缓慢。
有什么办法可以简化这个过程?
典型的用例是动画,尤其是AnimationController。由于它存储在State字段中,但我们通常希望在其持续时间内进行迭代。例:
class MyAnim extends StatefulWidget {
@override
_MyAnimState createState() => _MyAnimState();
}
class _MyAnimState extends State<MyAnim> with SingleTickerProviderStateMixin {
AnimationController animationController;
@override
void initState() {
animationController =
AnimationController(vsync: this, duration: const Duration(seconds: 1));
super.initState();
}
@override
void dispose() {
animationController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container();
}
}
Run Code Online (Sandbox Code Playgroud) dart ×7
flutter ×7
angular ×1
angular-dart ×1
ecmascript-6 ×1
exception ×1
javascript ×1
memory-leaks ×1
stream ×1
typescript ×1
unit-testing ×1