Flutter生物识别插件biokit的使用
Flutter生物识别插件biokit的使用
创建序列
创建一个DNA
、RNA
或Peptide
实例:
DNA dnaSeq = DNA(seq: 'ATGCTA');
RNA rnaSeq = RNA(seq: 'AUGCUA');
Peptide pepSeq = Peptide(seq: 'MSLAKR');
DNA
和RNA
类必须用至少包含六个有效核苷酸的字符串初始化,而Peptide
类则需要至少两个有效的氨基酸。
如果传递给seq
参数的序列中的任何单体对于该类来说不合法,则会抛出错误。
添加序列元数据
可以选择在实例化时添加name
、id
和desc
元数据。以DNA
为例:
DNA dnaSeq = DNA(seq: 'ATGCTA', name: 'My Name', id: 'My ID', desc: 'My Description');
如果不设置name
、id
或desc
字段的值,则它们将接收默认的String
值。
获取属性
返回DNA
、RNA
或Peptide
实例的属性值:
dnaSeq.seq;
// ATGCTA
dnaSeq.len;
// 6
dnaSeq.id;
// 默认ID
dnaSeq.name;
// 默认名称
dnaSeq.desc;
// 默认描述
dnaSeq.type;
// dna
设置属性
更新DNA
、RNA
或Peptide
实例的属性:
dnaSeq.name = '新名称';
dnaSeq.id = '新ID';
dnaSeq.desc = '新描述';
序列信息
通过调用其info()
方法或将其打印到控制台来查看DNA
、RNA
或Peptide
实例的信息:
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()
方法返回具有指定长度的随机DNA
、RNA
或Peptide
实例,并将所需的序列长度传递给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()
方法将DNA
、RNA
或Peptide
实例的内容写入 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');
加法运算符
使用+
运算符返回两个或多个相同类型的DNA
、RNA
或Peptide
实例序列的连接结果:
RNA rnaSeq1 = RNA(seq: 'AUGCAG');
RNA rnaSeq2 = RNA(seq: 'GCUGAA');
rnaSeq1 + rnaSeq2;
// "AUGCAGGCUGAA"
反转
使用reverse()
方法反转DNA
、RNA
或Peptide
实例的序列:
Peptide pepSeq = Peptide(seq: 'MPAG');
pepSeq.reverse();
// GAPM
点突变
使用difference()
方法返回两个相同类型的DNA
、RNA
或Peptide
实例序列之间的位置差异数:
DNA dnaSeq1 = DNA(seq: 'ATGCAT');
// 差异:"A" 在索引 1 处,"T" 在索引 4 处。
DNA dnaSeq2 = DNA(seq: 'AAGCTT');
dnaSeq1.difference(oSeq: dnaSeq2)
// 2
基序检测
BioKit 提供了许多用于将基序与DNA
、RNA
或Peptide
实例的序列进行转换和匹配的功能。
查找基序
使用findMotif()
方法返回DNA
、RNA
或Peptide
实例的序列与传递给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
}
]
}
*/
共享基序
返回两个相同类型的DNA
、RNA
或Peptide
实例序列之间的最长共享基序:
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()
方法返回DNA
、RNA
或Peptide
实例的序列中每个单体的频率:
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
}
*/
忽略终止氨基酸
当对DNA
或RNA
实例调用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
获取器返回DNA
、RNA
或Peptide
实例的序列长度外,还可以使用lenMinus()
方法返回减去特定单体后的序列长度:
DNA dnaSeq = DNA(seq: 'ATGCGAT');
dnaSeq.len;
// 7
dnaSeq.lenMinus(monomer: 'A');
// 5
生成组合
使用combinations()
方法返回DNA
、RNA
或Peptide
实例的序列的所有可能组合:
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()
方法返回DNA
或RNA
实例的序列中某个密码子的频率,通过将感兴趣的密码子传递给codon
参数:
RNA rnaSeq = RNA(seq: 'AUGAGGAUGCACAUG');
rnaSeq.codonFreq(codon: 'AUG');
// 3
请注意,codonFreq()
方法以每三个核苷酸为步长扫描序列,从序列的第一个三个核苷酸开始。因此,只有当密码子出现在扫描批次中时才能被检测到。
互补链
使用complementary()
方法返回DNA
或RNA
实例序列的互补链:
DNA dnaSeq = DNA(seq: 'AAACCCGGT');
dnaSeq.complementary();
// TTTGGGCCA
要返回反向互补链,可以向rev
参数传递true
:
dnaSeq.complementary(rev: true);
// ACCGGGTTT
鸟嘌呤和胞嘧啶含量
使用gcContent()
方法返回DNA
或RNA
实例的序列中鸟嘌呤和胞嘧啶含量的百分比:
DNA dnaSeq = DNA(seq: 'TCCCTACGCCG');
dnaSeq.gcContent();
// 72.73
翻译
使用translate()
方法返回DNA
或RNA
实例的序列的氨基酸翻译产物:
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()
方法返回DNA
或RNA
实例序列中存在的开放阅读框的蛋白质:
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
}
]
}
*/
通过向minSiteLen
和maxSiteLen
参数传递值来更改限制性位点搜索长度。
转换/颠换比率
使用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
更多关于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'),
),
],
),
),
);
}
}
说明
- 依赖安装:确保在
pubspec.yaml
中添加了biokit
依赖,并运行flutter pub get
。 - UI构建:在
main.dart
中,我们创建了一个简单的Flutter应用,包含一个按钮用于触发生物识别认证。 - 认证函数:
authenticateUser
函数使用Biometrics.authenticate
方法触发认证流程。localizedReason
参数是向用户显示的认证原因,stickyAuth
参数决定认证成功后是否保持认证状态。 - 状态管理:使用
setState
来更新UI,显示认证结果。 - 错误处理:捕获并处理认证过程中可能发生的错误。
注意事项
- 在实际项目中,你可能需要根据不同的平台(iOS和Android)进行额外的配置。例如,在iOS上,你可能需要在
Info.plist
中添加相关权限描述。 - 生物识别功能依赖于设备的硬件支持,因此确保在测试设备上启用了相应的生物识别功能(如Touch ID或Face ID)。
这个示例代码提供了一个基本的框架,你可以根据具体需求进行扩展和修改。