使用带有变量的延迟库



对不起,我是一个初学者,我的英语是大致的。

我不知道我所做的是否正确,如果这听起来很愚蠢,我很抱歉(再次)。我试图恢复某些文件的内容,只有当我需要他们。我认为这对优化我的dart/flutter应用程序和减少加载时间很有好处。

所以我有一个文件列表,编码如下:

  • N101aze。dart,其中包含一个名为N101aze
  • 的地图
  • N101qsd。dart,其中包含名为N101qsd
  • 的列表
  • N101wxc。dart,其中包含一个名为N101wxc
  • 的列表

同样,我有:

  • N102aze。dart,其中包含一个名为N102aze
  • 的地图
  • N102qsd。飞镖,包含一个名为N102qsd列表
  • N102wxc。dart,其中包含一个名为N102wxc
  • 的列表

等等…

每次我都有另一个文件像这样命名和编码:

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

当我使用上面列出的名字时,它工作得很好。

现在,我真正想要的是使用一个键(这里叫做kkey)来调用我想要的库当我调用onPressed on ElevatedButton:

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
...

注意:

  • 我"simplified"代码只保留最基本的
  • part1为Map, part2为List

对于greet函数,我想我理解它不工作,因为N101, N102, N103…没有类型,我的键是字符串的类型,但我不知道该怎么做…

调用我的地图和我的列表,我不知道该怎么做…特别是当我想要连接key和aze(例如)时。

我知道我可以使用Switch Case语句来查看从key到return的所有字符,例如"N101.loadlibrary()"one_answers";N101.N101.aze"但号码"开关";和";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,
),
),
);
}
},
);
}
}

最新更新