欢迎光临散文网 会员登陆 & 注册

flutter聊天app应用实例|flutter聊天界面

2020-05-14 09:44 作者:xiaoyan2019  | 我要投稿

FlutterChat聊天室项目是基于flutter+dart+video_player+photo_view+image_picker等技术实现的跨平台聊天实例。项目整体界面仿制微信聊天app,实现了消息/表情发送、图片预览、Popwin长按弹窗、视频/红包/朋友圈功能。

技术栈

  • 使用技术:Flutter 1.12.13/Dart 2.7.0

  • 视频组件:chewie: ^0.9.7

  • 图片/拍照:image_picker: ^0.6.6+1

  • 图片预览组件:photo_view: ^0.9.2

  • 弹窗组件:showModalBottomSheet/AlertDialog/SnackBar

  • 本地存储:shared_preferences: ^0.5.7+1

  • 字体图标:阿里iconfont字体图标库

flutter登录|注册表单验证

flutter提供了两个文本框组件:TextField 和 TextFormField
本文是使用TextField实现,并在文本框后添加清空文本框/密码查看图标

TextField(

  keyboardType: TextInputType.phone,

  controller: TextEditingController.fromValue(TextEditingValue(

    text: formObj['tel'],

    selection: new TextSelection.fromPosition(TextPosition(affinity: TextAffinity.downstream, offset: formObj['tel'].length))

  )),

  decoration: InputDecoration(

    hintText: "请输入手机号",

    isDense: true,

    hintStyle: TextStyle(fontSize: 14.0),

    suffixIcon: Visibility(

      visible: formObj['tel'].isNotEmpty,

      child: InkWell(

        child: GStyle.iconfont(0xe69f, color: Colors.grey, size: 14.0), onTap: () {

          setState(() { formObj['tel'] = ''; });

        }

      ),

    ),

    border: OutlineInputBorder(borderSide: BorderSide.none)

  ),

  onChanged: (val) {

    setState(() { formObj['tel'] = val; });

  },

)


TextField(

  decoration: InputDecoration(

    hintText: "请输入密码",

    isDense: true,

    hintStyle: TextStyle(fontSize: 14.0),

    suffixIcon: InkWell(

      child: Icon(formObj['isObscureText'] ? Icons.visibility_off : Icons.visibility, color: Colors.grey, size: 14.0),

      onTap: () {

        setState(() {

          formObj['isObscureText'] = !formObj['isObscureText'];

        });

      },

    ),

    border: OutlineInputBorder(borderSide: BorderSide.none)

  ),

  obscureText: formObj['isObscureText'],

  onChanged: (val) {

    setState(() { formObj['pwd'] = val; });

  },

)

通过flutter提供的SnackBar来提示消息

final _scaffoldkey = new GlobalKey<ScaffoldState>();

void _snackbar(String title, {Color color}) {

    _scaffoldkey.currentState.showSnackBar(SnackBar(

      backgroundColor: color ?? Colors.redAccent,

      content: Text(title),

      duration: Duration(seconds: 1),

    ));

}

flutter桌面app启动图标右上角圆点|未读消息小红点

如上图:在flutter中没有圆点提示组件,需要自己封装实现;


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中TextField文本框提供的maxLines属性可实现多行/换行文本,不过默认会有个高度,可在外层加个容器限制最小高度,然后设置 maxLines: null、 keyboardType: TextInputType.multiline

Container(

    margin: GStyle.margin(10.0),

    decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(3.0)),

    constraints: BoxConstraints(minHeight: 30.0, maxHeight: 150.0),

    child: TextField(

        maxLines: null,

        keyboardType: TextInputType.multiline,

        decoration: InputDecoration(

          hintStyle: TextStyle(fontSize: 14.0),

          isDense: true,

          contentPadding: EdgeInsets.all(5.0),

          border: OutlineInputBorder(borderSide: BorderSide.none)

        ),

        controller: _textEditingController,

        focusNode: _focusNode,

        onChanged: (val) {

          setState(() {

            editorLastCursor = _textEditingController.selection.baseOffset;

          });

        },

        onTap: () {handleEditorTaped();},

    ),

),

通过ListView里controller属性提供的jumpTo方法及_msgController.position.maxScrollExtent

ScrollController _msgController = new ScrollController();

ListView(

    controller: _msgController,

    padding: EdgeInsets.all(10.0),

    children: renderMsgTpl(),

)

// 滚动消息至聊天底部

void scrollMsgBottom() {

    timer = Timer(Duration(milliseconds: 100), () => _msgController.jumpTo(_msgController.position.maxScrollExtent));

}


okey,基于flutter+dart开发聊天实例就介绍到这里,后续会分享更多实战案例!!💪💪

作者:xiaoyan2019
https://www.bilibili.com/read/cv5983396
出处: bilibili


flutter聊天app应用实例|flutter聊天界面的评论 (共 条)

分享到微博请遵守国家法律