import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'HomeModel.dart'; import 'Message.dart'; class Homepage extends StatefulWidget { const Homepage({super.key}); @override State createState() => _HomepageState(); } class _HomepageState extends State { late StreamSubscription subscription; final HomeModel viewModel = HomeModel(); final TextEditingController _chatController = TextEditingController(); final ScrollController _scrollController = ScrollController(); String text = ""; String data = ''; List list = []; Future chat() async { EasyLoading.show(status: 'loading...'); viewModel.chat(text, 'Assistant'); } void _textFieldChanged(String str) { text = str; } @override void initState() { // TODO: implement initState super.initState(); // 监听输入变化 _chatController.addListener(() { print(_chatController.text); }); subscription = viewModel.streamController.stream.listen((newData) { String code = newData['code']; if (code.isNotEmpty) { if (code == "chat") { //有数据 data = newData['data']; list.add(Message(data, false)); setState(() {}); Future.delayed(Duration(milliseconds: 500), () { _scrollController.jumpTo(_scrollController.position.maxScrollExtent); }); //EasyLoading.showToast(data); print("data" + data.toString()); } EasyLoading.dismiss(); } else { EasyLoading.dismiss(); } }); } @override void dispose() { // TODO: implement dispose _chatController.dispose(); subscription.cancel(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: AppBar( title: Text( "王梦阳", style: TextStyle(fontSize: 18), ), backgroundColor: Colors.white, centerTitle: true, ), body: Container( child: Column( children: [ Container( width: double.infinity, height: 1, color: Color(0xFFDFDFDF), ), Expanded( child: Container( alignment: Alignment.topCenter, child: ListView.builder( // reverse: true, controller: _scrollController, itemCount: list.length, itemBuilder: (Context, index) { return _item(index); }), )), Card( elevation: 5, color: Colors.white, margin: EdgeInsets.only(left: 16, right: 16, bottom: 30), child: Row( children: [ //输入框 Expanded( child: Container( margin: EdgeInsets.only(left: 16), child: TextField( controller: _chatController, onChanged: _textFieldChanged, decoration: InputDecoration( border: InputBorder.none, // 移除非聚焦状态下的边框 enabledBorder: InputBorder.none, // 移除获得焦点但未输入内容时的边框 focusedBorder: InputBorder.none, // 移除输入时的边框 ), ), ), ), GestureDetector( onTap: () { chat(); list.add(Message(text, true)); _chatController.clear(); Future.delayed(Duration(milliseconds: 200), () { _scrollController.jumpTo(_scrollController.position.maxScrollExtent); }); setState(() {}); }, child: Container( width: 70, height: 50, alignment: Alignment.center, decoration: BoxDecoration(color: Color(0xFF006CFF), borderRadius: BorderRadius.all(Radius.circular(8.0))), child: Text( "发送", style: TextStyle(color: Colors.white), ), ), ) ], ), ), ], ), ), ); } _item(index) { return Padding( padding: EdgeInsets.symmetric(vertical: 8.0), child: !list[index].isMe ? Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: 45, height: 45, margin: EdgeInsets.only(left: 16, top: 4), child: ClipRRect( borderRadius: BorderRadius.circular(10), child: Image( fit: BoxFit.cover, image: AssetImage('assets/images/avatar2.png'), ), ), ), ConstrainedBox( constraints: BoxConstraints( maxWidth: MediaQuery.of(context).size.width - 150, // 确保不超过屏幕宽度 ), child: Container( margin: EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0), padding: EdgeInsets.all(12.0), decoration: BoxDecoration( color: Color(0xFFECECEC), borderRadius: BorderRadius.circular(16.0), ), child: Text( list[index].text, style: TextStyle( fontSize: 16, color: Colors.black, ), ), ), ), ], ) : Row( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.start, children: [ ConstrainedBox( constraints: BoxConstraints( maxWidth: MediaQuery.of(context).size.width - 150, // 确保不超过屏幕宽度 ), child: Container( margin: EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0), padding: EdgeInsets.all(12.0), decoration: BoxDecoration( color: Color(0xFF006CFF), borderRadius: BorderRadius.circular(16.0), ), child: Text( list[index].text, style: TextStyle( fontSize: 16, color: Colors.white, ), ), ), ), Container( width: 45, height: 45, margin: EdgeInsets.only(right: 16, top: 4), child: ClipRRect( borderRadius: BorderRadius.circular(10), child: Image( fit: BoxFit.cover, image: AssetImage('assets/images/avatar1.png'), ), ), ), ], ), ); } }