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

1 回复

更多关于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');
}
回到顶部