Flutter维基数据访问插件wikibase_sdk的使用
Flutter维基数据访问插件wikibase_sdk的使用
wikibase_sdk
wikibase_sdk
是一个用于在 Dart 中与 wikibase-sdk JavaScript 包进行交互的包。
所有函数都已重新实现,但大部分尚未经过测试。因此,这仍然是一个 正在进行的工作。
请参阅 JavaScript 包的文档以了解如何使用库中的函数。
所有接受对象字面量的参数都有专用的 Dart 类来输入它们。如果在 JavaScript 文档中某个参数可以接受字符串或字符串列表,则在 Dart 实现中该参数只接受 List<String>
。
请查看 Flutter 的 <code>/example/lib/main.dart</code>
文件,了解如何在您的 Dart 或 Flutter 项目中使用此包。
所有 <code>simplify</code>
方法和其他一些方法需要输入 JavaScript 对象并返回 JavaScript 对象。因此,需要像 <a href="https://pub.dev/packages/node_interop"><code>node_interop</code></a>
提供的 <a href="https://pub.dev/documentation/node_interop/latest/node_interop.util/jsify.html"><code>jsify</code></a>
和 <a href="https://pub.dev/documentation/node_interop/latest/node_interop.util/dartify.html"><code>dartify</code></a>
这样的 Dart 和 JavaScript 之间的转换函数。
在未来的发展中,所有函数都将被添加到 Flutter 示例项目中并进行测试。
使用示例
以下是一个完整的示例代码,展示如何在 Flutter 项目中使用 wikibase_sdk
插件来访问维基数据。
示例代码
import 'dart:js'; // 引入 JavaScript 支持
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:wikibase_sdk/wikibase_sdk.dart'; // 引入 wikibase_sdk
import 'package:http/http.dart' as http; // 引入 HTTP 请求支持
import 'dart:convert'; // 引入 JSON 编码和解码支持
import 'package:node_interop/util.dart'; // 引入 JavaScript 和 Dart 之间的转换工具
void main() => runApp(MyApp()); // 启动应用
class Entity { // 定义实体类
List<String> id = [];
}
class MyApp extends StatefulWidget { // 定义主应用状态
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> { // 定义主应用状态的实现
final _formKey = GlobalKey<FormState>(); // 表单验证 Key
final _entity = Entity(); // 实体对象
var result = ''; // 结果存储变量
[@override](/user/override)
Widget build(BuildContext context) { // 构建 UI
var wbk = WBK(Config( // 初始化 Wikibase SDK 配置
instance: 'https://www.wikidata.org', // 设置维基数据实例
sparqlEndpoint: 'https://query.wikidata.org/sparql', // 设置 SPARQL 查询端点
));
return MaterialApp( // 启动 Material 应用
home: Scaffold( // 主页面布局
body: SingleChildScrollView( // 单页滚动布局
child: Column( // 垂直布局
children: [
Form( // 表单组件
key: _formKey, // 绑定表单验证 Key
child: Column( // 嵌套垂直布局
children: <Widget>[ // 表单字段
TextFormField( // 输入框
validator: (value) { // 验证器
if (value == null || value.isEmpty) {
return '请输入有效文本';
}
return null;
},
decoration: InputDecoration( // 输入框样式
border: UnderlineInputBorder(),
labelText: 'Item ID'),
onSaved: (input) { // 表单保存回调
setState(() => _entity.id = input!.split('|')); // 更新实体 ID
},
),
Row( // 按钮水平布局
children: [
ElevatedButton( // 按钮 1
onPressed: () async { // 按钮点击事件
final form = _formKey.currentState;
// 验证表单
if (form!.validate()) {
form.save();
var entities = Entities( // 创建实体对象
ids: _entity.id,
languages: ['en'], // 指定语言
);
var url = wbk.getEntities(entities); // 获取实体 URL
result = (await http.get(Uri.parse(url))).body; // 发起请求
setState(() {}); // 更新 UI
}
},
child: const Text('getEntities'), // 按钮文本
),
ElevatedButton( // 按钮 2
onPressed: () async {
final form = _formKey.currentState;
if (form!.validate()) {
form.save();
var entities = Entities(
ids: _entity.id,
languages: ['en'],
props: ['info', 'claims'], // 指定属性
format: 'json',
redirections: false,
);
var url = wbk.getManyEntities(entities);
result = (await http.get(Uri.parse(url))).body;
setState(() {});
}
},
child: const Text('getManyEntities'),
),
ElevatedButton( // 按钮 3
onPressed: () async {
final form = _formKey.currentState;
if (form!.validate()) {
form.save();
var sitelinks = Sitelinks(
titles: _entity.id,
sites: ['enwikivoyage'],
languages: ['en', 'fr', 'de'],
props: ['info', 'claims'],
format: 'json',
redirections: false,
);
var url = wbk.getEntitiesFromSitelinks(sitelinks);
result = (await http.get(Uri.parse(url))).body;
setState(() {});
}
},
child: const Text('getEntitiesFromSitelinks'),
),
ElevatedButton( // 按钮 4
onPressed: () async {
final form = _formKey.currentState;
if (form!.validate()) {
form.save();
var entities = Entities(ids: _entity.id);
var url = wbk.getEntities(entities);
var entity = jsonDecode((await http.get(Uri.parse(url))).body);
var result1 = wbk.simplify.labels(jsify(
entity['entities'][_entity.id[0]]['labels']));
result = jsonEncode(dartify(result1));
setState(() {});
}
},
child: const Text('simplify.labels'),
),
ElevatedButton( // 按钮 5
onPressed: () async {
final form = _formKey.currentState;
if (form!.validate()) {
form.save();
var entities = Entities(ids: _entity.id);
var url = wbk.getEntities(entities);
var entity = jsonDecode((await http.get(Uri.parse(url))).body);
print(entity['entities'][_entity.id[0]]['claims']);
var result1 = wbk.simplify.claims(
jsify(
entity['entities'][_entity.id[0]]['claims']),
SimplifyClaimsOptions(keepIds: true));
result = jsonEncode(dartify(result1));
setState(() {});
}
},
child: const Text('simplify.claims'),
),
],
),
],
),
),
SelectableText(result), // 显示结果
],
),
),
),
);
}
}
更多关于Flutter维基数据访问插件wikibase_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter维基数据访问插件wikibase_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
wikibase_sdk
是一个用于在 Flutter 应用中访问维基数据(Wikidata)的插件。它提供了一种简单的方式来查询和操作维基数据中的实体和属性。以下是如何在 Flutter 项目中使用 wikibase_sdk
的基本步骤。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 wikibase_sdk
依赖:
dependencies:
flutter:
sdk: flutter
wikibase_sdk: ^0.1.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
2. 初始化 SDK
在你的 Flutter 应用中,首先需要初始化 wikibase_sdk
。通常你可以在 main.dart
文件中进行初始化:
import 'package:wikibase_sdk/wikibase_sdk.dart';
void main() {
// 初始化 Wikibase SDK
WikibaseSdk.initialize(
baseUrl: 'https://www.wikidata.org/w/api.php', // 维基数据的 API 地址
);
runApp(MyApp());
}
3. 查询实体
你可以使用 WikibaseSdk
来查询维基数据中的实体。以下是一个简单的例子,查询一个实体的基本信息:
import 'package:flutter/material.dart';
import 'package:wikibase_sdk/wikibase_sdk.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Wikidata Example'),
),
body: Center(
child: FutureBuilder<WikibaseEntity>(
future: WikibaseSdk.instance.getEntity('Q42'), // 查询 Q42(Douglas Adams)
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else if (!snapshot.hasData) {
return Text('No data found');
} else {
var entity = snapshot.data!;
return Text('Entity Label: ${entity.labels['en']?.value}');
}
},
),
),
),
);
}
}
4. 查询属性
你也可以查询实体的属性。以下是一个查询实体属性的例子:
import 'package:flutter/material.dart';
import 'package:wikibase_sdk/wikibase_sdk.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Wikidata Example'),
),
body: Center(
child: FutureBuilder<WikibaseEntity>(
future: WikibaseSdk.instance.getEntity('Q42'), // 查询 Q42(Douglas Adams)
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else if (!snapshot.hasData) {
return Text('No data found');
} else {
var entity = snapshot.data!;
var birthDate = entity.claims['P569']?.first?.mainsnak?.datavalue?.value;
return Text('Birth Date: $birthDate');
}
},
),
),
),
);
}
}
5. 其他操作
wikibase_sdk
还支持其他操作,如搜索实体、获取实体描述等。你可以参考插件的文档来了解更多功能。
6. 处理错误
在实际应用中,你可能需要处理各种错误情况,例如网络错误、API 错误等。你可以使用 try-catch
块来捕获异常,并在 UI 中显示错误信息。
try {
var entity = await WikibaseSdk.instance.getEntity('Q42');
// 处理实体数据
} catch (e) {
// 处理错误
print('Error: $e');
}