NIM : 1705541004
Tugas 2
Main.dart:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/cupertino.dart';
void main() {
runApp(new verlinApp());
}
Pada code diatas import ‘..’ digunakan untuk mengimport library kemudian void main
sebagai fungsi utama yang akan dieksekusi sehingga ketika flutter dijalankan maka secara otomatis
mengeksekusi value dari verlinApp. verlinApp merupakan kelas yang berisi stateless widget,
stateless widget adalah widget yang berfungsi untuk menampilkan widget yang nilainya tidak bisa
diubah yang dapat di extends dari class StatelessWidget dan melakukan @override dari method
fungsi Widget build() yang fungsinya untuk mengembalikan sebuah objek Widget sehingga widget
yang ingin ditambahkan dapat ditaruh didalam method fungsi Widget build(). Didalam
MaterialApp berisi fungsi untuk mengatur tema (theme) dan mengatur layar default yang user lihat
dalam app(home), home diatur untuk mereferensikan dari kelas ChatScreen dimana ChatScreen
merupakan StatefulWidget yang berarti widget dapat berubah.
Secara garis besar app ini dibagi menjadi dua subclass dengan dua tipe widget yaitu sebuah
root-level VerlinApp yang tidak dapat berubah (StatelessWidget) dan child Chatscreen
(StatefulWidget) adalah widget yang dapat berubah ketika pesan dikirim dan internal state
berubah.
Nama : Lino Verlin
NIM : 1705541004
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,
onChanged: (String text){
setState(() {
_isComposing = text.length > 0;
Nama : Lino Verlin
NIM : 1705541004
});
},
onSubmitted: _handleSubmitted,
decoration: new InputDecoration.collapsed(hintText: "Send a message"),
),
),
new Container(
margin: new EdgeInsets.symmetric(horizontal: 4.0),
child: Theme.of(context).platform == TargetPlatform.iOS ?
new CupertinoButton(
child: new Text("Send"),
onPressed: _isComposing
? () => _handleSubmitted(_textController.text)
: null,) :
new IconButton(
icon: new Icon(Icons.send),
onPressed: _isComposing ?
() => _handleSubmitted(_textController.text) : null,
)
),
],
),
),
);
}
membangun kembali ChatscreenState. Didalam class ChatScreenState dapat di isi sebuah input
field dan send button serta UI untuk menampilkan messages.
1. Final TextEditingController digunakan untuk mendefinisikan method private yang disebut
_buildTextComposer() yang me-return Container widget dengan konfigurasi widget
TextField.
2. Final List<> _messages digunakan ketika user mengirimkan sebuah message dari text fiel
maka app harus menambahkan message baru didalam message list. Dimana
_handleSumbitted() method yang digunakan untuk mengimplementasikan ini.
class ChatMessage extends StatelessWidget{
ChatMessage({this.text, this.animationController});
final String text;
final AnimationController animationController;
@override
Widget build(BuildContext context){
const String _name = "verlin";
return new SizeTransition(
sizeFactor: new CurvedAnimation(
parent: animationController, curve: Curves.easeOut),
axisAlignment: 0.0,
child: new Container(
margin: const EdgeInsets.symmetric(vertical: 10.0),
child: new Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
new Container(
margin: const EdgeInsets.only(right: 16.0),
child: new CircleAvatar(child: new Text(_name[0])),
),
new Expanded(child: new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
new Text(_name, style: Theme.of(context).textTheme.subhead),
new Container(
margin: const EdgeInsets.only(top: 5.0),
child: new Text(text),
),],),),],),)
);
}
}
Main.dart code:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/cupertino.dart';
void main() {
runApp(new verlinApp());
}
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,
onChanged: (String text){
setState(() {
_isComposing = text.length > 0;
});
},
onSubmitted: _handleSubmitted,
decoration: new InputDecoration.collapsed(hintText: "Send a message"),
),
),
new Container(
margin: new EdgeInsets.symmetric(horizontal: 4.0),
child: Theme.of(context).platform == TargetPlatform.iOS ?
new CupertinoButton(
child: new Text("Send"),
onPressed: _isComposing
? () => _handleSubmitted(_textController.text)
: null,) :
new IconButton(
icon: new Icon(Icons.send),
onPressed: _isComposing ?
() => _handleSubmitted(_textController.text) : null,
)
),
],
),
),
);
}
void dispose(){
for (ChatMessage message in _messages)
message.animationController.dispose();
super.dispose();
}
}
//theme colors
final ThemeData kIOSTheme = new ThemeData(
primaryColor: Colors.greenAccent[100],
primaryColorBrightness: Brightness.dark,
primarySwatch: Colors.blue,
);
final ThemeData kDefaultTheme = new ThemeData(
primarySwatch: Colors.deepPurple,
accentColor: Colors.brown,
);