flutter+dart聊天实例|flutter仿微信App聊天界面

3
回复
303
查看
[复制链接]

25

主题

30

帖子

328

安币

攻城狮

Rank: 3Rank: 3

发表于 2020-5-14 18:17:24 | 显示全部楼层 |阅读模式
本帖最后由 xiaoyan2015 于 2020-5-14 18:19 编辑

flutter是google在开发者大会上发布的跨平台应用开发框架,有谷歌强大的技术支撑,收到很多开发者的追捧。作为前端开发也需要学习了解一下。
今天给大家分享的是基于Flutter+Dart+chewie+image_picker+photo_view等技术开发的仿微信界面聊天室,实现了消息+表情、图片查看、长按菜单、视频/红包/朋友圈等功能。

022360截图20200512003659242.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字体图标库

[JavaScript] 查看源文件 复制代码
/**
 * @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
009360截图20200512003023266.png 011360截图20200512003108139.png
013360截图20200512003159188.png 015360截图20200512003221856.png
016360截图20200512003322336.png 018360截图20200512003422368.png
019360截图20200512003435098.png 021360截图20200512003604679.png
023360截图20200512003901929.png 025360截图20200512004305675.png
026360截图20200512004446202.png 027360截图20200512004604921.png
029360截图20200512004708377.png 031360截图20200512005508992.png

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

360截图20200513090806912.png
[JavaScript] 查看源文件 复制代码
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
[JavaScript] 查看源文件 复制代码
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
[JavaScript] 查看源文件 复制代码
InkWell(
    splashColor: Colors.grey[200],
    child: Container(...),
    onTapDown: (TapDownDetails details) {
        _globalPositionX = details.globalPosition.dx;
        _globalPositionY = details.globalPosition.dy;
    },
    onLongPress: () {
        _showPopupMenu(context);
    },
),


[JavaScript] 查看源文件 复制代码
// 长按弹窗
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(
                ...
              ),
            )
          ],
        );
      }
    );
}


Okay,基于Flutter/Dart开发仿微信界面应用app聊天实例就介绍到这里,后续会继续分享更多实例项目,希望大家能喜欢!



2

主题

440

帖子

7576

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 前天 09:02 | 显示全部楼层
我只是路过打酱油的。

2

主题

440

帖子

7576

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 前天 09:03 | 显示全部楼层
在哪里下载示例呢?

3

主题

655

帖子

4812

安币

码皇(巴士元老)

Rank: 8Rank: 8

QQ达人

发表于 前天 11:03 | 显示全部楼层
...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )