使用带有变量的延迟库

问题描述 投票:0回答:2

提前抱歉,我是初学者,我的英语水平很差。

我不知道我正在做的事情是否正确,或者如果这对你来说听起来很愚蠢,那么我不会(再次)感到抱歉。 我仅在需要时才尝试恢复某些文件的内容。 我认为这对于优化我的 dart/flutter 应用程序并减少加载时间很有好处。

所以 所以我有一个像这样编码的文件列表:

  • N101aze.dart,其中包含一个名为 N101aze 的 Map
  • N101qsd.dart,其中包含一个名为 N101qsd 的列表
  • N101wxc.dart,其中包含一个名为 N101wxc 的列表
  • ...

和我一样:

  • N102aze.dart,其中包含一个名为 N102aze 的 Map
  • N102qsd.dart,其中包含一个名为 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

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

现在,我真正想要的是当我在 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

...

注:

  • 我“简化”了代码,仅保留必需的内容
  • part1 是 Map,part2 是 List

对于greet函数,我想我知道它不起作用,因为N101,N102,N103...没有类型,我的kkey是String类型,但我不知道可以做什么...

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

我知道我可以使用 Switch Case 语句来查看 kkey 中的所有字符以返回,例如“N101.loadlibrary()”和“N101.N101.aze”,但是“Switch”和“Case”的数量太大是值得的,并且随着应用程序的增长,可能性的数量可能会增加。

我希望你能理解我的问题,我希望这不是太愚蠢,我正在学习^^。

感谢您的关注!再见!

flutter dart deferred
2个回答
1
投票

不幸的是,没有办法以这种方式动态地执行此操作,即通过名称获取声明。虽然 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,
              ),
            ),
          );
        }
      },
    );
  }
}

0
投票

这里的loadingparts是什么意思?你能分享这个场景的工作存储库吗?

© www.soinside.com 2019 - 2024. All rights reserved.