请选择 进入手机版 | 继续访问电脑版

默认
发表评论 3
flutter聊天实例|flutter+dart仿微信界面

Flutter 是 Google 开源的 UI 框架,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。
相比较目前的混合开发方案,Flutter 提供了大量的文档,能非常快速且友好的让你加入到这个大家庭,针对移动端,Flutter 提供了符合 Android 风格的 Material 和符合 iOS 风格的 Cupertino,同时对不同平台也做了不同的兼容。
感兴趣的同学可以关注 GitHub:https://github.com/flutter/flutter
360截图20200514184339089.png
今天给大家分享的是基于flutter+dart等技术开发的仿微信app聊天界面实例,实现了消息+表情、图片预览、长按PopupWin菜单、视频/朋友圈等功能。
未标题-2.png

技术框架
  • 编码/技术:Vscode + Flutter 1.12.13/Dart 2.7.0
  • 视频组件:chewie: ^0.9.7
  • 图片/拍照:image_picker: ^0.6.6+1
  • 图片预览组件:photo_view: ^0.9.2
  • 弹窗组件:SimpleDialog/AlertDialog/SnackBar(flutter封装自定义)
  • 本地存储:shared_preferences: ^0.5.7+1
  • 字体图标:阿里iconfont字体图标库



360截图20200512115224384.png

flutter主入口main.dart页面配置
/**
 * @tpl Flutter入口页面 | Q:282310962
 */

import 'package:flutter/material.dart';

// 引入公共样式
import 'styles/common.dart';

// 引入底部Tabbar页面导航
import 'components/tabbar.dart';

// 引入地址路由
import 'router/routes.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter App',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primaryColor: GStyle.appbarColor,
      ),
      home: TabBarPage(),
      onGenerateRoute: onGenerateRoute,
    );
  }
}


001360截图20200512002407906.png 003360截图20200512002631530.png
004360截图20200512002755155.png 005360截图20200512002840849.png
007360截图20200512002934978.png 008360截图20200512003004490.png
010360截图20200512003054184.png 013360截图20200512003159188.png
016360截图20200512003322336.png 018360截图20200512003422368.png
019360截图20200512003435098.png 021360截图20200512003604679.png
022360截图20200512003659242.png 023360截图20200512003901929.png
024360截图20200512003937594.png 025360截图20200512004305675.png
026360截图20200512004446202.png 028360截图20200512004645881.png
029360截图20200512004708377.png 031360截图20200512005508992.png

flutter图标组件Icon及自定义图标
flutter中自带图标使用非常简单 Icon(Icons.search)
如果想要自定义图标,如使用阿里图标iconfont如何实现,这时就需要用到IconData来实现自定义图标了。Icon(IconData(0xe60e, fontFamily:'iconfont'), size:24.0)
使用IconData需要先下载阿里图标库字体文件,然后在pubspec.yaml中引入字体

360截图20200513090806912.png
class GStyle {
    // __ 自定义图标
    static iconfont(int codePoint, {double size = 16.0, Color color}) {
        return Icon(
            IconData(codePoint, fontFamily: 'iconfont', matchTextDirection: true),
            size: size,
            color: color,
        );
    }
}


flutter实现未读消息数字圆点|红点提醒
app中,类似如下红点提醒很常见,平时微信中就有见到,可以flutter没有提供这种组件,只能自定义实现了。
360截图20200513091117720.png
class GStyle {
    // 消息红点
    static badge(int count, {Color color = Colors.red, bool isdot = false, double height = 18.0, double width = 18.0}) {
        final _num = count > 99 ? '···' : count;
        return Container(
            alignment: Alignment.center, height: !isdot ? height : height/2, width: !isdot ? width : width/2,
            decoration: BoxDecoration(color: color, borderRadius: BorderRadius.circular(100.0)),
            child: !isdot ? Text('$_num', style: TextStyle(color: Colors.white, fontSize: 12.0)) : null
        );
    }
}


flutter实现自定义长按菜单
在flutter中实现在长按位置弹出菜单 复制/转发/收藏/删除聊天
360截图20200513091947231.png
可通过InkWell组件提供的onTapDown事件获取坐标点,onLongPress事件弹出框
InkWell(
    splashColor: Colors.grey[200],
    child: Container(...),
    onTapDown: (TapDownDetails details) {
        _globalPositionX = details.globalPosition.dx;
        _globalPositionY = details.globalPosition.dy;
    },
    onLongPress: () {
        _showPopupMenu(context);
    },
),


// 长按弹窗
double _globalPositionX = 0.0; //长按位置的横坐标
double _globalPositionY = 0.0; //长按位置的纵坐标
void _showPopupMenu(BuildContext context) {
    // 确定点击位置在左侧还是右侧
    bool isLeft = _globalPositionX > MediaQuery.of(context).size.width/2 ? false : true;
    // 确定点击位置在上半屏幕还是下半屏幕
    bool isTop = _globalPositionY > MediaQuery.of(context).size.height/2 ? false : true;

    showDialog(
      context: context,
      builder: (context) {
        return Stack(
          children: <Widget>[
            Positioned(
              top: isTop ? _globalPositionY : _globalPositionY - 200.0,
              left: isLeft ? _globalPositionX : _globalPositionX - 120.0,
              width: 120.0,
              child: Material(
                ...
              ),
            )
          ],
        );
      }
    );
}


好了,基于flutter开发聊天室实例就分享到这里,希望能有些帮助!


即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:新技术展望:5G消息能取代IM?一文读懂5G消息的前世今生!下一篇:美团点评的移动端网络优化实践:大幅提升连接成功率、速度等
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
推荐方案
评论 3
源码是开源,还是卖的?
签名: 《如何让你的WebSocket断网重连更快速?》http://www.52im.net/thread-3098-1-1.html
欣赏下
签名: 的 哈啊哈哈哈
签名: 的 哈啊哈哈哈
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部