Flutter血糖监测插件dexcom的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter血糖监测插件dexcom的使用

关于

dexcom for Dart 允许你使用 Dexcom Share 获取你的 Dexcom 连续血糖监测(CGM)数据,或者任何其他人的数据来运行你的应用程序。包括时间(自Enoch以来的毫秒数)、读数和趋势。只需使用你的电子邮件和密码即可访问所有的葡萄糖数据!用户名可以是电子邮件、用户名或电话号码。

重要信息

警告:此包处于测试阶段(版本号为0.x.x),请自行承担风险使用。

警告:此包会获取、处理、计算并输出实时血糖水平。请勿将其用于重要的医疗治疗决策。

我们不对因使用本程序或任何使用它的程序而造成的任何医疗事件/紧急情况负责。请自行承担风险使用。

特性

非常简单易用。只需创建一个包含用户名和密码的Dexcom对象,然后获取用户的最新读数。脚本会自动处理所有账户ID、会话ID和会话创建。用户名可以是电子邮件、用户名或电话号码。

使用方法

验证登录
String username = "用户名";
String password = "密码";
var dexcom = Dexcom(username, password);
List<dynamic>? response;

try {
    // getReadings 可以选择设置为 false(默认为 true),如果你只想检查会话是否成功
    await dexcom.verifyLogin(username, password, [optional: getReadings]);
    print("验证帐户成功");
} catch (e) {
    print("无法验证帐户: $e");
}

这将登录用户到他们的帐户并获取他们的数据。如果两者都成功(或者会话成功且getReadings设置为false),它将返回:

{"success": true, "error": "none"};

然而,如果失败,它将返回:

// 如果会话失败(用户名/密码错误):
{"success": false, "error": "session"}
// 如果无法检索读数(可能是因为过去48小时内没有读数):
{"success": false, "error": "readings"}
获取数据
String username = "用户名";
String password = "密码";
var dexcom = Dexcom(username, password);
List<dynamic>? response;
try {
    response = await dexcom.getGlucoseReadings([optional: minutes, maxCount]);
    print("使用dexcom读取数据: $dexcom");
} catch (e) {
    print("无法使用dexcom读取数据: $e");
}

if (response != null) {
    print("接收到的数据: $response");
    return response;
} else {
    print("数据为空");
}

这实际上会从用户那里获取葡萄糖读数。如果失败,它会自动尝试重新创建会话。这是样本数据(实际上是实际读数):

[
    {
        WT: Date(1731645818222),
        ST: Date(1731645818222),
        DT: Date(1731645818222-0600),
        Value: 155,
        Trend: Flat
    },
    {
        WT: Date(1731645518663),
        ST: Date(1731645518663),
        DT: Date(1731645518663-0600),
        Value: 155,
        Trend: FortyFiveDown
    }
]

可以看到,这是一个包含两个项目的数组,因为这是我想让程序获取的数量。顶部的那个(项目0)是最新的。WT和ST都告诉你该值何时被采集。DT,我甚至不知道是什么意思。Value是实际的葡萄糖值。趋势是指箭头的方向。趋势可以是:

  • Flat:平稳
  • FortyFiveDown:缓慢下降(-1/分钟)
  • FortyFiveUp:缓慢上升(+1/分钟)
  • SingleDown:下降(-2/分钟)
  • SingleUp:上升(+2/分钟)
  • DoubleDown:快速下降(-3/分钟)
  • DoubleUp:快速上升(+3/分钟)
  • None:无趋势
  • NonComputable:图表太乱了,Dexcom无法知道葡萄糖水平的走向。如果你愿意,你可以自己尝试计算。
  • RateOutOfRange:血糖水平上升或下降得太快,无法计算。这通常发生在传感器错误期间,在传感器失效之前,血糖水平会随机下降50以上。

其他信息

此包是基于Python的pydexcom。我(和ChatGPT的一些帮助)将其移植到Flutter(版本0.0.0),然后最终移植到Dart(版本0.1.2)。


以下是完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'dexcom Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(
          seedColor: Colors.green, // For Dexcom
          brightness: Brightness.light,
        ),
        useMaterial3: true,
      ),
      darkTheme: ThemeData(
        colorScheme: ColorScheme.fromSeed(
          seedColor: Colors.green, // For Dexcom
          brightness: Brightness.dark,
        ),
        brightness: Brightness.dark,
        useMaterial3: true,
      ),
      home: const Home(),
    );
  }
}

class Home extends StatefulWidget {
  const Home({super.key});

  [@override](/user/override)
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  // 更改以测试你的Dexcom帐户

  String username = "用户名"; // 可以是电子邮件、用户名或电话号码
  String password = "密码";

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("dexcom Example"),
        centerTitle: true,
      ),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            children: [
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Text(
                  "按按钮查看dexcom插件的效果!",
                  style: TextStyle(
                    fontSize: 20,
                  ),
                ),
              ),
              Text("用户名: $username\n密码: $password"),
              TextButton(
                child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Text("获取过去的6个葡萄糖读数"),
                ),
                onPressed: () async {
                  List data = await getGlucoseReadings(username, password);
                  List readings = [];
                  for (var item in data) {
                    readings.add("${item["Value"]} ${item["Trend"]}");
                  }
                  showDialogue("过去的6个葡萄糖读数", readings.toString());
                },
              ),
              TextButton(
                child: Text("验证登录"),
                onPressed: () async {
                  try {
                    await verifyLogin(username, password);
                    showDialogue(
                        "验证登录", "登录成功验证");
                  } catch (e) {
                    showDialogue(
                        "验证登录", "登录未成功验证: $e");
                  }
                },
              ),
            ],
          ),
        ),
      ),
    );
  }

  Future<List> getGlucoseReadings(String username, String password) async {
    print("加载中...");
    try {
      Dexcom dexcom = Dexcom(username, password);
      List readings = await dexcom.getGlucoseReadings(maxCount: 6);
      return readings;
    } catch (e) {
      showDialogue("无法验证登录", e.toString());
      throw Exception(e);
    }
  }

  Future<void> verifyLogin(String username, String password) async {
    print("加载中...");
    Dexcom dexcom = Dexcom(username, password);
    try {
      Map verify = await dexcom.verifyLogin(username, password);
      if (verify["success"]) {
        return;
      } else {
        throw Exception(verify["error"]);
      }
    } catch (e) {
      throw Exception(e);
    }
  }

  void showDialogue(String title, String message) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text(title),
          content: Text(message),
          actions: [
            TextButton(
              onPressed: () {
                Navigator.of(context).pop();
              },
              child: const Text('确定'),
            ),
          ],
        );
      },
    );
  }
}

更多关于Flutter血糖监测插件dexcom的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter血糖监测插件dexcom的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中集成Dexcom血糖监测插件需要遵循Dexcom的API规范,并确保你具备相应的开发者权限和认证。以下是一个简化的代码示例,展示了如何在Flutter中集成和使用Dexcom API来获取血糖数据。请注意,实际应用中需要处理更多的错误处理、身份验证和安全措施。

首先,确保你已经安装了必要的Flutter依赖项,并创建了一个新的Flutter项目。

  1. 添加HTTP请求库: 为了与Dexcom API进行通信,我们可以使用dio库,它是一个强大的HTTP客户端库。

    # 在你的 pubspec.yaml 文件中添加以下依赖
    dependencies:
      flutter:
        sdk: flutter
      dio: ^4.0.0  # 请检查最新版本
    

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

  2. 创建Dexcom API服务: 创建一个新的Dart文件,例如 dexcom_api_service.dart,用于封装与Dexcom API的通信逻辑。

    import 'package:dio/dio.dart';
    
    class DexcomApiService {
      private static const baseUrl = 'https://api.dexcom.com/v2'; // 示例URL,实际使用时应替换为Dexcom提供的API端点
      private final Dio dio;
    
      DexcomApiService(this.dio);
    
      // 获取血糖数据的示例方法
      Future<Map<String, dynamic>> fetchGlucoseData(String accessToken, String userId) async {
        try {
          final response = await dio.get(
            '$baseUrl/users/$userId/glucose',
            options: Options(
              headers: {
                'Authorization': 'Bearer $accessToken',
                'Content-Type': 'application/json',
              },
            ),
          );
    
          return response.data;
        } catch (error) {
          throw error;
        }
      }
    }
    
  3. 在主应用程序中使用服务: 在你的主Dart文件(通常是 main.dart)中,初始化Dexcom API服务并使用它来获取血糖数据。

    import 'package:flutter/material.dart';
    import 'package:dio/dio.dart';
    import 'dexcom_api_service.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Dexcom Glucose Monitor'),
            ),
            body: GlucoseDataScreen(),
          ),
        );
      }
    }
    
    class GlucoseDataScreen extends StatefulWidget {
      @override
      _GlucoseDataScreenState createState() => _GlucoseDataScreenState();
    }
    
    class _GlucoseDataScreenState extends State<GlucoseDataScreen> {
      final Dio dio = Dio();
      String glucoseData = '';
    
      @override
      void initState() {
        super.initState();
        _fetchGlucoseData();
      }
    
      Future<void> _fetchGlucoseData() async {
        final String accessToken = 'YOUR_ACCESS_TOKEN_HERE'; // 请替换为实际的访问令牌
        final String userId = 'YOUR_USER_ID_HERE'; // 请替换为实际的用户ID
    
        final DexcomApiService service = DexcomApiService(dio);
        try {
          final data = await service.fetchGlucoseData(accessToken, userId);
          setState(() {
            glucoseData = data.toString(); // 你可以根据需要格式化输出
          });
        } catch (error) {
          print('Error fetching glucose data: $error');
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return Center(
          child: Text(glucoseData),
        );
      }
    }
    

注意事项

  • 你需要替换 YOUR_ACCESS_TOKEN_HEREYOUR_USER_ID_HERE 为实际的Dexcom API访问令牌和用户ID。
  • 访问令牌通常是通过OAuth2或其他认证机制获得的,你可能需要实现一个完整的认证流程来获取令牌。
  • 实际的Dexcom API端点和请求参数可能与此示例不同,请参考Dexcom的开发者文档进行适当调整。
  • 确保你的应用遵循Dexcom的隐私政策和数据使用条款。

这个示例提供了一个基本的框架,展示了如何在Flutter应用中集成Dexcom API来获取血糖数据。实际应用中可能需要更复杂的逻辑来处理认证、错误处理和用户交互。

回到顶部