Flutter实战一Flutter聊天应用(一)
不知不觉,进阶的教程已经写了几十篇了,通过前面的学习,大家已经打下了良好的基础,接下来我们就开始进行项目实战吧! 我们现在要写一个叫“谈天说地”的应用程序,这是一个简单、可扩展的聊天应用程序,能实时显示信息,用户可以输入文本信息,也可以通过按返回键或发送图标发送,还可以在iOS和Android设备上运行。 首先我们要在IntelliJ编辑器中启动一个新的Flutter项目:
现在我们修改一下默认的示例应用程序,添加的第一个元素是一个简单的
import 'package:flutter/material.dart';
void main() {
runApp(new MaterialApp(
title: '谈天说地',home: new Scaffold(
appBar: new AppBar(
title: new Text('谈天说地'),)
)
));
}
要指定用户在应用程序中看到的默认屏幕,需要在 为了给交互式组件打下基础,我们将简单的应用程序分解为两个不同的控件子类:一个永远不会更改的根级别的 import 'package:flutter/material.dart';
void main() {
runApp(new TalkcasuallyApp());
}
class TalkcasuallyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: '谈天说地',home: new ChatScreen(),);
}
}
class ChatScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('谈天说地'),)
);
}
}
上面代码中的新控件有一些共同点:它们是布局控件。他们的角色是执行布局任务,比如锚定、对齐和分发其他控件。 在这里要插一句话。随着您继续进行更改并优化应用程序的UI,您可以快速查看结果,而不需要重新启动完整的应用程序。使用Flutter的热重新加载功能将更新的源文件注入正在运行的Dart虚拟机(Dart Virtual Machine)并刷新UI。热重载是实验、原型设计和迭代的强大工具。需要注意的是,在IntelliJ IDEA中,热重载按钮是一个黄色闪电图标。 Flutter框架提供了一个名为TextField的质感设计控件,它是一个有状态的控件,具有用于自定义输入字段行为的属性。作为该项目的第一个有状态控件,它需要一些修改才能管理内部状态更改。 在Flutter中,如果要在窗口控件中可视化呈现状态数据,则应将此数据封装在 以下代码片段显示了如何开始在 覆盖 class ChatScreen extends StatefulWidget {
@override
State createState() => new ChatScreenState();
}
class ChatScreenState extends State<ChatScreen> {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('谈天说地'),)
);
}
}
现在, 当你对一个类或方法有疑问时,查看Flutter框架API的源代码定义对我们是很有用,可以更好地了解幕后情况。您可以通过选择一个类或方法名称,然后右键单击并选择“Go to Declaration”选项,从IntelliJ的编辑器面板轻松完成此操作。根据操作系统的不同,您也可以点击键盘上的命令或控制按钮。这是一个很好的习惯呢! 现在,我们的应用程序有能力管理状态,您可以使用输入字段和发送按钮构建 class ChatScreenState extends State<ChatScreen> {
final TextEditingController _textController = new TextEditingController();
//...
以下代码片段显示了如何定义一个名为 从 添加一个
class ChatScreenState extends State<ChatScreen> {
final TextEditingController _textController = new TextEditingController();
void _handleSubmitted(String text) {
_textController.clear();
}
Widget _buildTextComposer() {
return new Container(
margin: const EdgeInsets.symmetric(horizontal: 8.0),child: new TextField(
controller: _textController,onSubmitted: _handleSubmitted,decoration: new InputDecoration.collapsed(hintText: '发送消息'),)
);
}
//...
现在,告诉应用程序如何显示文本输入控件,在 class ChatScreenState extends State<ChatScreen> {
//...
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('谈天说地'),),body: _buildTextComposer()
);
}
}
这里要特别注意一点,从无状态到有状态控件的更改需要重新启动应用程序。 接下来,我们将在文本字段的右侧添加一个“发送”按钮,由于我们要显示与输入字段相邻的按钮,因此我们将使用 class ChatScreenState extends State<ChatScreen> {
//...
Widget _buildTextComposer() {
return new Container(
margin: const EdgeInsets.symmetric(horizontal: 8.0),child: new Row(
children: <Widget> [
new Flexible(
child: new TextField(
controller: _textController,)
),]
)
);
}
//...
}
我们现在可以创建一个 将您的 class ChatScreenState extends State<ChatScreen> {
//...
Widget _buildTextComposer() {
return new Container(
margin: const EdgeInsets.symmetric(horizontal: 8.0),new Container(
margin: new EdgeInsets.symmetric(horizontal: 4.0),child: new IconButton(
icon: new Icon(Icons.send),onPressed: () => _handleSubmitted(_textController.text)),)
]
)
);
}
//...
}
这里要解释一下,在Dart语法中, 使用默认的质感设计主题,按钮的颜色为黑色,要在应用程序中显示主要颜色的图标,可以使用不同的主题。 图标从 class ChatScreenState extends State<ChatScreen> {
//...
Widget _buildTextComposer() {
return new IconTheme(
data: new IconThemeData(color: Theme.of(context).accentColor),child: new Container(
margin: const EdgeInsets.symmetric(horizontal: 8.0),child: new Row(
children: <Widget> [
new Flexible(
child: new TextField(
controller: _textController,)
),new Container(
margin: new EdgeInsets.symmetric(horizontal: 4.0),child: new IconButton(
icon: new Icon(Icons.send),onPressed: () => _handleSubmitted(_textController.text)
),)
]
)
)
);
}
//...
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |