Flutter生物识别插件biokit的使用

Flutter生物识别插件biokit的使用

创建序列

创建一个DNARNAPeptide实例:

DNA dnaSeq = DNA(seq: 'ATGCTA');

RNA rnaSeq = RNA(seq: 'AUGCUA');

Peptide pepSeq = Peptide(seq: 'MSLAKR');

DNARNA类必须用至少包含六个有效核苷酸的字符串初始化,而Peptide类则需要至少两个有效的氨基酸。

如果传递给seq参数的序列中的任何单体对于该类来说不合法,则会抛出错误。

添加序列元数据

可以选择在实例化时添加nameiddesc元数据。以DNA为例:

DNA dnaSeq = DNA(seq: 'ATGCTA', name: 'My Name', id: 'My ID', desc: 'My Description');

如果不设置nameiddesc字段的值,则它们将接收默认的String值。

获取属性

返回DNARNAPeptide实例的属性值:

dnaSeq.seq;
// ATGCTA

dnaSeq.len;
// 6 

dnaSeq.id;
// 默认ID

dnaSeq.name;
// 默认名称

dnaSeq.desc;
// 默认描述

dnaSeq.type;
// dna

设置属性

更新DNARNAPeptide实例的属性:

dnaSeq.name = '新名称';

dnaSeq.id = '新ID';

dnaSeq.desc = '新描述';

序列信息

通过调用其info()方法或将其打印到控制台来查看DNARNAPeptide实例的信息:

dnaSeq.info();
/*
{
   "seq":"ATGCTA",
   "type":"dna",
   "monomers":6,
   "name":"新名称",
   "id":"新ID",
   "desc":"新描述"
}
*/

print(dnaSeq);
/*
{
   "seq":"ATGCTA",
   "type":"dna",
   "monomers":6,
   "name":"新名称",
   "id":"新ID",
   "desc":"新描述"
}
*/

随机序列

使用random()方法返回具有指定长度的随机DNARNAPeptide实例,并将所需的序列长度传递给len参数:

// 生成一个包含20个核苷酸的随机DNA实例。
DNA dnaSeq = DNA.random(len: 20);

dnaSeq.info();

/*
{
   "seq":"TAACTTCGATCGCTCTGGCA",
   "type":"dna",
   "monomers":20,
   "name":"默认名称",
   "id":"默认ID",
   "desc":"默认描述"
}
*/

FASTA 数据

BioKit 包含了许多用于处理 FASTA 格式数据的方法和函数。

UniProt ID

使用Utils类的静态uniprotIdToFASTA()方法返回蛋白质数据的 FASTA 格式的字符串:

String proteinFASTA = await Utils.uniprotIdToFASTA(uniprotId: 'B5ZC00');

/*
>sp|B5ZC00|SYG_UREU1 Glycine--tRNA ligase OS=Ureaplasma urealyticum ...
MKNKFKTQEELVNHLKTVGFVFANSEIYNGLANAWDYGPLGVLLKNNLKNLWWKEFVTKQ
KDVVGLDSAIILNPLVWKASGHLDNFS ...
*/

请注意,此方法需要网络访问。

读取字符串

使用readFASTA()方法解析 FASTA 格式的字符串数据:

List<Map<String, String>> proteinMaps = await Utils.readFASTA(str: proteinFASTA);

/*
[
   {
      "seq":"MKNKFKTQEELVNHLKTVGFVFANSEIYNGLANAWDYGPLGVLLKNNLKNLWWKEFVTK ... ",
      "id":"sp|B5ZC00|SYG_UREU1",
      "desc":"Glycine--tRNA ligase OS=Ureaplasma urealyticum serovar 10 (... "
   }
]
*/

读取文件

从 FASTA 格式的文本文件中读取数据:

List<Map<String, String>> dnaMaps = await Utils.readFASTA(path: './gene_bank.txt');

/*
[
   {
      "seq":"GGCAGATTCCCCCTAGACCCGCCCGCACCATGGTCAGGCATGCCCCTCCTCATCGCTGG ... ",
      "id":"HSBGPG",
      "desc":"Human gene for bone gla protein (BGP)"
   },
   {
      "seq":"CCACTGCACTCACCGCACCCGGCCAATTTTTGTGTTTTTAGTAGAGACTAAATACCATA ... ",
      "id":"HSGLTH1",
      "desc":"Human theta 1-globin gene"
   }
]
*/

写入文件

使用toFASTA()方法将DNARNAPeptide实例的内容写入 FASTA 格式的文本文件:

// 获取第一个 Map 对象。
Map<String, String> firstSeq = dnaMaps.first;

// 创建一个新的 DNA 实例。
DNA dnaSeq = DNA(seq: firstSeq['seq']!, id: firstSeq['id']!, desc: firstSeq['desc']!);

// 将实例内容写入 FASTA 格式的文件。
dnaSeq.toFASTA(path: '../deliverables', filename: 'my_dna_seq');

/*
>HSBGPG Human gene for bone gla protein (BGP)
GGCAGATTCCCCCTAGACCCGCCCGCACCATGGTCAGGCATGCCCCTCCTCATCGCTGGG
CACAGCCCAGAGGGTATAAACAGTGCTGGAGGCTGGCGGGGCAGGCCAGCTGAGTCCTGA
GCAGCAGCCCAGCGCAGCCACCGAGACA ...
*/

DNA 分析报告

通过调用DNA实例上的report()方法创建 DNA 分析报告:

dnaSeq.report(path: '../deliverables', creator: 'John Doe', title: 'BGP Report');

加法运算符

使用+运算符返回两个或多个相同类型的DNARNAPeptide实例序列的连接结果:

RNA rnaSeq1 = RNA(seq: 'AUGCAG');
RNA rnaSeq2 = RNA(seq: 'GCUGAA');

rnaSeq1 + rnaSeq2; 
// "AUGCAGGCUGAA"

反转

使用reverse()方法反转DNARNAPeptide实例的序列:

Peptide pepSeq = Peptide(seq: 'MPAG');

pepSeq.reverse();
// GAPM

点突变

使用difference()方法返回两个相同类型的DNARNAPeptide实例序列之间的位置差异数:

DNA dnaSeq1 = DNA(seq: 'ATGCAT');

// 差异:"A" 在索引 1 处,"T" 在索引 4 处。
DNA dnaSeq2 = DNA(seq: 'AAGCTT');

dnaSeq1.difference(oSeq: dnaSeq2)
// 2

基序检测

BioKit 提供了许多用于将基序与DNARNAPeptide实例的序列进行转换和匹配的功能。

查找基序

使用findMotif()方法返回DNARNAPeptide实例的序列与传递给motif参数的序列之间所有匹配项的索引:

RNA rnaSeq = RNA(seq: 'GAUAUAUC');

rnaSeq.findMotif(motif: 'AUAU');

/*
{
   "matchCount":2,
   "matchIndices":[
      {
         "match":"AUAU",
         "startIndex":1,
         "endIndex":4
      },
      {
         "match":"AUAU",
         "startIndex":3,
         "endIndex":6
      }
   ]
}
*/

// 设置 overlap 为 false 返回不重叠的匹配索引:
rnaSeq.findMotif(motif: 'AUAU', overlap: false);

/*
{
   "matchCount":1,
   "matchIndices":[
      {
         "match":"AUAU",
         "startIndex":0,
         "endIndex":3
      }
   ]
}
*/

共享基序

返回两个相同类型的DNARNAPeptide实例序列之间的最长共享基序:

DNA dnaSeq1 = DNA('GATATA');

DNA dnaSeq2 = DNA('AGCATA');

dnaSeq1.sharedMotif(oSeq: dnaSeq2); 
// ATA

手动将基序转换为正则表达式

findMotif()方法会自动将传递给motif参数的基序转换为正则表达式格式,但也可以使用motifToRe()函数手动执行转换:

Utils.motifToRe(motif: 'N{P}[ST]{P}'); 
// 'N[^P][S|T|][^P]'

// 不需要更改。
Utils.motifToRe(motif: 'ATGC');
// ATGC

剪接

使用splice()方法返回移除了某个基序的所有出现的序列:

RNA rnaSeq = RNA(seq: 'AUCAUGU');

// 移除所有出现的 'AU'。
rnaSeq.splice(motif: 'AU');
// CGU

单体频率

使用freq()方法返回DNARNAPeptide实例的序列中每个单体的频率:

DNA dnaSeq = DNA(seq: 'AGCTTTTCAGC');

dnaSeq.freq();

/*
{
   "A":2.0,
   "G":2.0,
   "C":3.0,
   "T":4.0
}
*/

总计百分比

通过向freq()方法的norm参数传递true来返回每个单体计数占总和的百分比:

dnaSeq.freq(norm: true);

/*
{
   "A":18.2,
   "G":18.2,
   "C":27.3,
   "T":36.4
}
*/

忽略终止氨基酸

当对DNARNA实例调用translate()方法时,BioKit 返回氨基酸序列;当遇到终止密码子时,BioKit 不停止翻译,也不忽略终止密码子,而是将一个 “X” 字符放在氨基酸序列的相应位置:

// UAG 是终止密码子。
RNA rnaSeq = RNA(seq: 'CGGUAGACU'); 

rnaSeq.translate();

/*
{
   "aaSeq":"RXT",
   "nucCount":8,
   "aaCount":3
}
*/

因此,如果您使用aaSeq键的值创建一个新的Peptide实例,然后执行freq()方法,“X” 字符将被计入计算:

// 使用 RNA 实例翻译产物创建一个 Peptide 实例。
Peptide pepSeq = Peptide(seq: rnaSeq.translate()['aaSeq']!);

pepSeq.freq(); 

/*
{
   "R":1.0,
   "X":1.0,
   "T":1.0
}
*/ 

但是,如果您不想让"X"字符计入计算,可以向freq()方法的ignoreStopAA参数传递true

pepSeq.freq(ignoreStopAA: true);

/*
{
   "R":1.0,
   "T":1.0
}
*/

修改后的序列长度

除了可以通过使用len获取器返回DNARNAPeptide实例的序列长度外,还可以使用lenMinus()方法返回减去特定单体后的序列长度:

DNA dnaSeq = DNA(seq: 'ATGCGAT');

dnaSeq.len;
// 7 

dnaSeq.lenMinus(monomer: 'A');
// 5

生成组合

使用combinations()方法返回DNARNAPeptide实例的序列的所有可能组合:

Peptide pepSeq = Peptide(seq: 'MSTC');

pepSeq.combinations(); 
// [M, MS, MST, MSTC, S, ST, STC, T, TC]

// 按排序返回组合:
pepSeq.combinations(sorted: true);
// [MSTC, MST, STC, MS, ST, TC, M, S, T]

密码子频率

使用codonFreq()方法返回DNARNA实例的序列中某个密码子的频率,通过将感兴趣的密码子传递给codon参数:

RNA rnaSeq = RNA(seq: 'AUGAGGAUGCACAUG');

rnaSeq.codonFreq(codon: 'AUG');
// 3 

请注意,codonFreq()方法以每三个核苷酸为步长扫描序列,从序列的第一个三个核苷酸开始。因此,只有当密码子出现在扫描批次中时才能被检测到。

互补链

使用complementary()方法返回DNARNA实例序列的互补链:

DNA dnaSeq = DNA(seq: 'AAACCCGGT');

dnaSeq.complementary();
// TTTGGGCCA

要返回反向互补链,可以向rev参数传递true

dnaSeq.complementary(rev: true);
// ACCGGGTTT

鸟嘌呤和胞嘧啶含量

使用gcContent()方法返回DNARNA实例的序列中鸟嘌呤和胞嘧啶含量的百分比:

DNA dnaSeq = DNA(seq: 'TCCCTACGCCG');

dnaSeq.gcContent();
// 72.73

翻译

使用translate()方法返回DNARNA实例的序列的氨基酸翻译产物:

RNA rnaSeq = RNA(seq: 'AUGGCCAUGGCGCCCAGAACU');

rnaSeq.translate();

/*
{
   "aaSeq":"MAMAPRT",
   "nucCount":20,
   "aaCount":7
}
*/

通过向rev参数传递true返回反向互补翻译链:

rnaSeq.translate(rev: true); 

/*
{
   "aaSeq":"SSGRHGH",
   "nucCount":20,
   "aaCount":7
}
*/

通过向startIdx参数传递所需的起始索引修改翻译开始的位置:

rnaSeq.translate(startIdx: 2);

/*
{
   "aaSeq":"GHGAQN",
   "nucCount":18,
   "aaCount":6
}
*/

生成蛋白质

使用proteins()方法返回DNARNA实例序列中存在的开放阅读框的蛋白质:

DNA dnaSeq = DNA(seq: 'AGCCATGTAGCTAACTCAGGTTACATGGGGATGACCCCTGAATGATCCGAGTAGCATCTCAG');

dnaSeq.proteins(); 
// [MLLGSFRGHPHVT, MGMTPE, MTPE, M, M]

// 返回唯一的蛋白质:
dnaSeq.proteins(unique: true);
// [MLLGSFRGHPHVT, MGMTPE, MTPE, M]

转录

使用transcribe()方法返回DNA实例的序列的 RNA 转录产物:

DNA dnaSeq = DNA(seq: 'TACGTAA');

dnaSeq.transcribe();
// UACGUAA

通过向startIdx参数传递所需的起始索引更改转录的起始位置:

dnaSeq.transcribe(startIdx: 3); 
// GUAA

限制性位点

使用restrictionSites()方法返回DNA实例的序列中的限制性位点:

DNA dnaSeq = DNA(seq: 'TGCATGTCTATATG');

dnaSeq.restrictionSites();

/*
{
   "TGCA":[
      {
         "startIdx":0,
         "endIndex":4
      }
   ],
   "CATG":[
      {
         "startIdx":2,
         "endIndex":6
      }
   ],
   "TATA":[
      {
         "startIdx":8,
         "endIndex":12
      }
   ],
   "ATAT":[
      {
         "startIdx":9,
         "endIndex":13
      }
   ]
}
*/

通过向minSiteLenmaxSiteLen参数传递值来更改限制性位点搜索长度。

转换/颠换比率

使用tranRatio()方法返回两个DNA实例序列之间的转换/颠换比率:

DNA dnaSeq1 = DNA(seq: 'GACTGGTGGAAGT');

DNA dnaSeq2 = DNA(seq: 'TTATCGGCTGAAT');

dnaSeq1.tranRatio(oSeq: dnaSeq2); 
// 0.29

请注意,如果颠换的数量等于0,则该方法返回-1,因为除以0是未定义的,并导致结果为inf

双螺旋几何长度

使用dHelixGeoLen()方法返回由DNA实例的序列形成的双螺旋的几何长度(纳米):

DNA dnaSeq = DNA(seq: 'ATGCATGC');

dnaSeq.dHelixGeoLen();
// 2.72

双螺旋圈数

使用dHelixTurns()方法返回由DNA实例的序列形成的双螺旋的圈数:

DNA dnaSeq = DNA(seq: 'ATGCATGCATGCATGC');

dnaSeq.dHelixTurns();
// 1.6 

反向转录

使用revTranscribe()方法返回RNA实例的序列的反向转录产物:

RNA rnaSeq = RNA(seq: 'AUGCUAGU');

rnaSeq.revTranscribe();
// ATGCTAGT

单一质量

使用monoMass()方法返回Peptide实例的序列的单一质量(Da):

Peptide pepSeq = Peptide(seq: 'MSTGARVD');

pepSeq.monoMass();
// 817.38

通过向decimals参数传递所需的位数来修改小数位数:

pepSeq.monoMass(decimals: 1);
// 817.4

通过向kDa参数传递true来返回以 kDa 为单位的单一质量:

pepSeq.monoMass(kDa: true);
// 0.82

完整示例代码

import 'package:biokit/biokit.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'BioKit',
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  [@override](/user/override)
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  [@override](/user/override)
  void initState() {
    super.initState();
    DNA dna = DNA(seq: 'ATCGGC');
    print(dna.freq());
    // See: https://biokit.org/docs/usage
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text('BioKit'),
      ),
    );
  }
}

更多关于Flutter生物识别插件biokit的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter生物识别插件biokit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用biokit插件进行生物识别(如指纹或面部识别)的示例代码。biokit是一个用于iOS和Android平台的Flutter插件,支持生物识别认证。

首先,确保你已经在pubspec.yaml文件中添加了biokit依赖:

dependencies:
  flutter:
    sdk: flutter
  biokit: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,是一个使用biokit插件的简单示例代码:

main.dart

import 'package:flutter/material.dart';
import 'package:biokit/biokit.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Biokit Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BiometricScreen(),
    );
  }
}

class BiometricScreen extends StatefulWidget {
  @override
  _BiometricScreenState createState() => _BiometricScreenState();
}

class _BiometricScreenState extends State<BiometricScreen> {
  bool _isAuthenticated = false;

  Future<void> authenticateUser() async {
    try {
      bool result = await Biometrics.authenticate(
        context: context,
        localizedReason: 'Please authenticate to continue',
        stickyAuth: true,
      );

      setState(() {
        _isAuthenticated = result;
      });

      if (result) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Authenticated successfully!')),
        );
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Authentication failed.')),
        );
      }
    } catch (e) {
      print('Error during authentication: $e');
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Error: ${e.message}')),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Biometric Authentication'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              _isAuthenticated ? 'Authenticated' : 'Not Authenticated',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: authenticateUser,
              child: Text('Authenticate'),
            ),
          ],
        ),
      ),
    );
  }
}

说明

  1. 依赖安装:确保在pubspec.yaml中添加了biokit依赖,并运行flutter pub get
  2. UI构建:在main.dart中,我们创建了一个简单的Flutter应用,包含一个按钮用于触发生物识别认证。
  3. 认证函数authenticateUser函数使用Biometrics.authenticate方法触发认证流程。localizedReason参数是向用户显示的认证原因,stickyAuth参数决定认证成功后是否保持认证状态。
  4. 状态管理:使用setState来更新UI,显示认证结果。
  5. 错误处理:捕获并处理认证过程中可能发生的错误。

注意事项

  • 在实际项目中,你可能需要根据不同的平台(iOS和Android)进行额外的配置。例如,在iOS上,你可能需要在Info.plist中添加相关权限描述。
  • 生物识别功能依赖于设备的硬件支持,因此确保在测试设备上启用了相应的生物识别功能(如Touch ID或Face ID)。

这个示例代码提供了一个基本的框架,你可以根据具体需求进行扩展和修改。

回到顶部