提前抱歉,我是初学者,我的英语水平很差。
我不知道我正在做的事情是否正确,或者如果这对你来说听起来很愚蠢,那么我不会(再次)感到抱歉。 我仅在需要时才尝试恢复某些文件的内容。 我认为这对于优化我的 dart/flutter 应用程序并减少加载时间很有好处。
所以 所以我有一个像这样编码的文件列表:
和我一样:
等等...
每次我都有另一个文件被这样调用和编码:
N101.dart
export "path[...]/N101aze.dart";
export "path[...]/N101qsd.dart";
export "path[...]/N101wxc.dart";
...
现在在一个文件中我想进行这样的延迟加载:
import "path[...]/N101.dart" deferred as N101; //I know lowercase is better
我在需要时通过使用加载库
greet() async {
await N101.loadLibrary();
}
稍后我可以使用
调用我的地图和列表N101.N101aze
N101.N101qsd
当我使用上面列出的名称时,它工作得很好。
现在,我真正想要的是当我在 ElevatedButton 上调用 onPressed 时,使用一个键(这里称为 kkey)来调用我想要的库:
import 'package:flutter/material.dart';
import 'package:my_app/Models/SetColor.dart';
import "path[...]/N101.dart" deferred as N101; //I know lowercase is better
import "path[...]/N102.dart" deferred as N102;
import "path[...]/N103.dart" deferred as N103;
...
class CustomButton extends StatefulWidget {
const CustomButton({
required this.kkey,
}) : super(key: key);
final String kkey;
@override
State<CustomButton> createState() => _CustomButtonState();
}
class _CustomButtonState extends State<CustomButton> {
Future<void> greet(thekey) async {
await thekey.loadLibrary();
}
@override
Widget build(BuildContext context) {
return ElevatedButton(
child: Text(
widget.kkey
),
onPressed: () async {
await greet(widget.kkey); //it's not working beacause kkey type is String
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => LoadingParts(
part1: // here I want N101.N101aze when kkey="N101" so I want something like kkey.kkeyaze
part2: // here I want N101.N101qsd when kkey="N101" so I want something like kkey.kkeyqsd
...
注:
对于greet函数,我想我知道它不起作用,因为N101,N102,N103...没有类型,我的kkey是String类型,但我不知道可以做什么...
要调用我的地图和列表,我不知道该怎么做...特别是当我想将 kkey 与 aze 连接起来时(例如)。
我知道我可以使用 Switch Case 语句来查看 kkey 中的所有字符以返回,例如“N101.loadlibrary()”和“N101.N101.aze”,但是“Switch”和“Case”的数量太大是值得的,并且随着应用程序的增长,可能性的数量可能会增加。
我希望你能理解我的问题,我希望这不是太愚蠢,我正在学习^^。
感谢您的关注!再见!
不幸的是,没有办法以这种方式动态地执行此操作,即通过名称获取声明。虽然 Dart 是一种支持反射的静态语言,但 flutter 默认情况下并不支持。在 Flutter 中,
mirrors
包被禁用,以利于静态优化。还有 reflectable
但它有局限性,例如无法反映模块。
因此,修复它的方法是也使用静态代码来加载延迟库,如下所示。
在每个
NXXX.dart
文件上,其中 XXX
为 101、102、103 等,声明相同的映射。例如,在 N101.dart
中,它会是这样的:
// Create a map with all structures needed
final nmap = {
'aze': N101aze,
'qsd': N101qsd,
'wxc': N101wxc,
};
然后用法会是这样的:
class CustomButton extends StatefulWidget {
const CustomButton({
Key? key,
required this.kkey,
}) : super(key: key);
final String kkey;
@override
State<CustomButton> createState() => _CustomButtonState();
}
class _CustomButtonState extends State<CustomButton> {
Future<Map<String, Object>> greet(String thekey) async {
// Load the deferred module and return the structures
switch (thekey) {
case 'N101':
await N101.loadLibrary();
return N101.nmap;
case 'N102':
await N102.loadLibrary();
return N102.nmap;
case 'N103':
await N103.loadLibrary();
return N103.nmap;
default:
assert(false);
throw Exception('$thekey not mapped');
}
}
@override
Widget build(BuildContext context) {
return ElevatedButton(
child: Text(widget.kkey),
onPressed: () async {
// Get the common `nmap` from `greet` by `kkey`
final nmap = await greet(widget.kkey);
if (mounted) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => LoadingParts(
// Use the `nmap` by name
part1: nmap['aze']! as Map,
part2: nmap['qsd']! as List,
part3: nmap['wxc']! as List,
),
),
);
}
},
);
}
}
这里的loadingparts是什么意思?你能分享这个场景的工作存储库吗?