Flutter GetX 实现 ChatGPT 简单聊天界面

Flutter 是一款跨平台的移动应用开发框架,而 GetX 是 Flutter 中一种简单易用的状态管理和路由管理工具。本篇我们将使用 Flutter 和 GetX 实现一个简单的聊天界面,以与 ChatGPT 进行交互。

我们需要在 Flutter 项目中引入 GetX 库。在pubspec.yaml文件中添加以下依赖:

dependencies:flutter:sdk: flutterget: 

main函数中添加以下代码:

void main() {//在main函数第一行添加这句话WidgetsFlutterBinding.ensureInitialized();runApp(GetMaterialApp(home: ChatPage(),));
}

确保Flutter Widgets已经初始化,并且启动应用程序的ChatPage页面。

接下来,我们需要创建一个ApiProvider类,用于与 OpenAI API 进行交互。这个类继承自GetConnectGetConnect是一个轻量级的 HTTP 客户端,它能够简化与 API 的通信过程。以下是ApiProvider类的代码:

class ApiProvider extends GetConnect {/// 这里填写自己OpenAI API Keyfinal String apiKey = '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';final String baseUrl = 'https://api.openai.com';final Duration timeout = Duration(seconds: 30);Map<String, String> _headers() {return {'Content-Type': 'application/json','Authorization': 'Bearer $apiKey',};}ApiProvider() {httpClient.baseUrl = baseUrl;httpClient.timeout = timeout;httpClient.addAuthenticator((request)  {request.headers.addAll(_headers());return request;});}Future<Response> completions(String body) {return post('/v1/chat/completions', body);}
}

在这个类中,我们设置了 API 的基础 URL 和超时时间,并实现了 HTTP 请求的授权和身份验证。我们还实现了completions方法,用于向 OpenAI API 发送请求并获取聊天机器人的回复。注意这里需要设置自己账号的API KEY, 地址: https://platform.openai.com/account/api-keys

接下来,我们需要创建一个ChatLogic类,用于处理聊天机器人的逻辑。以下是ChatLogic类的代码:

class ChatLogic extends GetxController {final ChatState state = ChatState();final ApiProvider provider = ApiProvider();Future<void> sendMessage(String content) async {state.requestStatus(content);update();final response = await provider.completions(json.encode({"model": "gpt-3.5-turbo","messages": [{"role": "user", "content": "$content"}]}));try {if(response.statusCode == 200) {final data = response.body;final text = data['choices'][0]['message']['content'];state.responseStatus(text);} else {state.responseStatus(response.statusText ?? '请求错误,请稍后重试');}} catch(error) {state.responseStatus(error.toString());}update();}
}

在这个类中,我们创建了一个sendMessage方法,该方法接收用户的消息并发送给 OpenAI API,然后等待 API 返回响应。在收到响应后,我们将从 API 返回的 JSON 数据中提取出回复消息的内容,并将其更新到ChatState状态类的messages列表中,然后在 UI 中显示。

接下来,我们需要创建一个ChatState类来管理我们的应用程序状态。以下是ChatState类的代码:

class ChatState {String message = '';String sender = 'user';bool isRequesting = false;List<Map<String, dynamic>> messages = [];void requestStatus(String content) {messages.add({'text': content, 'sender': 'user'});sender = 'bot';messages.add({'text': '正在回复中...', 'sender': sender});isRequesting = true;message = '';}void responseStatus(String content) {messages.removeLast(); // Remove "正在回复中..." 状态messages.add({'text': content, 'sender': sender});sender = 'user';isRequesting = false;}
}

在这个类中,存储了聊天应用程序的状态信息,包括消息、发送者、请求状态和历史消息列表。requestStatus()方法用于更新状态以反映正在发送消息的状态,responseStatus()方法用于更新状态以反映接收到的消息。

最后,我们定义了ChatPage类,它继承自StatelessWidget,它将用于展示聊天对话框。以下是ChatPage类的代码:

class ChatPage extends StatelessWidget {ChatPage({Key? key}) : super(key: key);final logic = Get.put(ChatLogic());final state = Get.find<ChatLogic>().state;@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(centerTitle: true,title: Text('你问我答'),),body: GetBuilder<ChatLogic>(builder: (context) => Column(children: [Expanded(child: ListView.builder(itemCount: state.messages.length,itemBuilder: (BuildContext context, int index) {Map m = state.messages[index];return Padding(padding: const EdgeInsets.all(8.0),child: Row(mainAxisAlignment: m['sender'] == 'user'? MainAxisAlignment.end: MainAxisAlignment.start,children: [Flexible(child: Container(padding: const EdgeInsets.all(8.0),decoration: BoxDecoration(borderRadius: BorderRadius.circular(8.0),color: m['sender'] == 'user'? Colors.green[100]: Colors.white,),child: Text(m['text']),),)],),);},),),Container(decoration: BoxDecoration(color: Colors.white,borderRadius: BorderRadius.only(topLeft: Radius.circular(12.0),topRight: Radius.circular(12.0),),),child: Row(children: [Expanded(child: Padding(padding: const EdgeInsets.all(8.0),child: TextField(decoration: InputDecoration(hintText: '请输入消息',border: InputBorder.none,),controller:TextEditingController(text: state.message),onChanged: (value) {state.message = value;}),),),IconButton(icon: Icon(Icons.send),onPressed: state.isRequesting? null: () {logic.sendMessage(state.message);},),],),),],),),);}
}

该类包含一个ChatLogic实例和一个ChatState实例。在build()方法中,我们使用GetBuilder包装整个聊天界面。这个界面包括一个消息列表和一个输入框,用户可以在其中输入消息并发送给聊天机器人。ListView.builder用于显示历史消息,TextFieldIconButton用于接收用户输入并发送消息。在发送消息之前,会检查当前状态是否为请求状态,以避免重复发送请求。

到这里一个简单的聊天功能就完成了,运行下看看效果吧:

在这里插入图片描述

综上所述,本篇介绍了一个使用 Flutter 和 OpenAI API 实现的基于 GPT-3 的聊天机器人。通过实现ApiProvider、ChatLogicChatState类,我们能够将 OpenAI API 的功能集成到 Flutter 应用程序中,并实现一个基本的聊天界面。感兴趣的小伙们可以自己试试哈,Demo地址:https://github.com/smallmarker/OpenAIChat

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/4603.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于进程的拒绝访问

进程拒绝访问怎么办&#xff1f; hModuleSnap CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID); int errGetLastError(); if (hModuleSnap INVALID_HANDLE_VALUE) { printf("创建失败:%d/n ",err); return (FALSE); } 代码在这里总是…

无法中止进程无法访问操作拒绝访问

无法中止进程无法访问操作拒绝访问 解决方案&#xff1a;使用360解除占用 任务管理器显示进程路径 找到该进程的路径 右键使用360解除占用 注&#xff1a;此方法有可能会无效&#xff0c;如果谁有更好的方法&#xff0c;请说明&#xff0c;谢谢。 其他方法&#xff08;在控…

PermissionError: [WinError 5] 拒绝访问。: ‘../data‘

# 通过ToTensor实例将图像数据从PIL类型变换成32位浮点数格式&#xff0c; # 并除以255使得所有像素的数值均在0到1之间 trans transforms.ToTensor() mnist_train torchvision.datasets.FashionMNIST(root"../data", trainTrue, transformtrans, downloadTrue) mn…

对com1的访问被拒绝

对 " com1 " 的访问被拒绝编写了一个串口通信程序,运行调试,系统提示: 不对啊&#xff0c;我的机器可是新买的品牌机哟. 1 .检查我的com1是否运行正常并启用.右击我的电脑 --> 属性 --> 选择 " 硬件 " --> 设备管理器 --> 端口(com和LPT) --&g…

文件访问被拒绝?5个解决方法!

案例&#xff1a;文件访问被拒绝 【朋友们&#xff0c;想问问大家的电脑有遇到过文件访问被拒绝的情况吗&#xff1f;真的太头疼了&#xff0c;大家都是怎么解决的呢&#xff1f;】 在日常使用电脑和操作文件时&#xff0c;有时我们可能会遇到文件访问被拒绝的情况。这可能会…

PermissionError: [WinError 5] 拒绝访问

使用Pycharm运行时&#xff0c;报错&#xff1a;PermissionError: [WinError 5] 拒绝访问 但是使用终端&#xff08;Terminal&#xff09;运行就没有问题 尝试方案&#xff1a;三步解决python PermissionError: [WinError 5]拒绝访问的情况 &#xff0c;然而并没有解决问题 …

windows 错误: 无法终止 进程。 原因: 拒绝访问。

问题描述 想要kill掉进程&#xff0c;但报错出现拒绝访问导致进程关不掉。 解决方案&#xff1a; 权限不够,以管理员权限打开cmd&#xff0c;然后输入命令终止进程。 相关命令&#xff1a; tasklist #查看进程名和pid netstat -ano | findstr "端口号" #根据端…

WindowsApps拒绝访问

情况 访问win10系统的某个文件夹提示“拒绝你访问该文件夹。若要获取访问文件夹的权限&#xff0c;你需要使用安全选项卡。”。在打开C盘“Program Files”文件夹下的“WindowsApps”文件夹时&#xff0c;在获取权限无法打开后提示“拒绝你访问该文件夹”。 解决办法 1、首…

[转]permissionerror winerror 5 拒绝访问。

转载自&#xff1a;温柔易淡–windows下pip安装python模块时报错总结 前言&#xff1a; 这几天把python版本升级后&#xff0c;发现pip安装模块好多都报错&#xff08;暂不确定是不是因为升级导致的&#xff09;&#xff0c;我定睛一看&#xff0c;发现是权限的问题&#xff0…

PermissionError: [WinError 5] 拒绝访问。(已解决)

前言&#xff1a; 今天学OpenCV,在写一个关于车牌的识别时遇到的这个问题。因为在将车牌的位置框出来后&#xff0c;想用pytesseract将框出来的内容识别出来并输出&#xff0c;而车牌中又因为有汉字&#xff0c;于是想用 # coding utf -8 from PIL import Image import pytes…

如何处理phpmyadmin中访问被拒绝

一、出错的模样 二、如何解决这个问题 1、首先打开XAMPP中的 Apache 那一行中 config 按钮里的 phpmyadmin&#xff0c;如下图所示&#xff1a; 2、进入到文件中&#xff0c;添加你的数据库密码&#xff0c;如下图所示 三、让我们看下修改后的结果 成功&#xff01;&#xf…

phpMyAdmin访问被拒绝!

1、环境&#xff1a; XAMPP PhpStorm 2、phpMyAdmin配置文件路径&#xff1a; /Applications/XAMPP/xamppfiles/phpmyadmin/libraries/config.default.php 3、问题出现的原因&#xff1a; 在终端首次进入mysql命令行模式&#xff0c;提示设置密码&#xff0c;设置后在浏览器…

ChatGPT常见问题,Access denied的解决办法

今天&#xff0c;突然想登录一登录ChatGPT&#xff0c;提示 Access denied, You do not have access to chat.openai.com 怎么办&#xff1f; “Access denied You do not have access to chat.openai.com. The site owner may have set restrictions that prevent you from ac…

PermissionError: [WinError 5] 拒绝访问。解决办法

PermissionError: [WinError 5] 拒绝访问 问题描述解决办法一、找到programdata下anaconda3的python二、进入Users的权限&#xff0c;将除了特殊权限外&#xff0c;全部挂上√。三、在返回到anaconda3的目录&#xff0c;进入anaconda3的属性&#xff0c;设置权限 问题描述 当在…

WinSCP拒绝访问问题

文章目录 前言一、问题描述二、搜索问题三、解决方案总结 前言 大家好&#xff0c;我是三&#x1f40e;&#xff01;最近使用VMware虚拟机配置了Ubuntu系统&#xff0c;想使用WinSCP软件将电脑上的一些文件上传到虚拟机中时&#xff0c;发现了一些问题。现将问题以及解决方法分…

关于PermissionError: [WinError 5] 拒绝访问的解决方案

在python使用pip命令安装各种package时&#xff0c;可能会发生下列现象&#xff1a; PermissionError: [WinError 5] 拒绝访问。: c:\\program files\\python36\\Lib\\site-packages\\selenium *因我安装的是selenium包&#xff0c;所以报错信息的路径会和selenium有关&#xf…

收发网易,雅虎,hotmail,gmail邮件可能遇到的问题的解答

一、我使用新申请的网易的126/163邮件箱&#xff0c;能在网页上收邮件&#xff0c;但是通过FOXMAIL无法收信&#xff0c;错误提示&#xff1a;没有权限使用POP3 &#xff0c;但是我以前的126/163邮箱是可以正常使用的&#xff0c; 错误如下图提示&#xff0c; 二、我使用新申请…

问题解决: Google企业邮箱收不到Postfix发的邮件

最新更新参考博客: 问题解决: Google企业邮箱收不到Postfix发的邮件 今天群里小伙伴@佰宝小筑安装postfix时遇到的问题, 记录一下. 如果你的情况相似, 可以对照解决. 他的网站域名是xxx.com, 使用Google的企业邮箱, Contact Form 7 内设置的发件邮箱是1@xxx.com, 装完测试的时…

手机邮箱收不到验证邮件怎么办,分享邮箱没有收到验证邮件的解决办法

工作中你是否遇到过邮箱收不到验证邮件的情况&#xff0c;那你知道如何解决吗&#xff1f;今天就将自己学到的方法教给大家&#xff0c;小本本记下来哟&#xff01; 小伙伴们&#xff0c;不知不觉一年又要过去了&#xff0c;剩下一过月就是2022年了&#xff0c;今年也是小编离开…

TeamViewer 收不到邮件该怎么办?

首先打开你的TeamViewer软件&#xff0c;先在一台计算机中你的账户登录。如果没有账户的可以自行注册一个&#xff0c;操作方法很简单&#xff0c;参考&#xff1a;TeamViewer账号注册教程。 然后在另一台上登录这个账户&#xff0c;这时会弹出一个提示框&#xff0c;如下图所示…