Flutter
Flutter
Google. Dengan menggunakan Flutter, Anda dapat membuat aplikasi Android dan
iOS sekaligus. Flutter menggunakan bahasa Dart yang juga dibuat oleh Google dan
merupakan bahasa general purpose. Artinya, Dart mampu berjalan di banyak
platform.
Keunggulan Flutter :
• hot reload
• Aplikasi yang kita buat dengan Flutter dapat di-build ke Android dan iOS.
Contoh aplikasi yang dibangun dengan flutter :
• Alibaba (Android);
• Topline (Android);
• Android Studio;
• Android SDK;
• Flutter SDK;
• Disk Space: 400 MB (does not include disk space for IDE/tools).
• https://storage.googleapis.com/flutter_infra/releases/stable/windows/flutter_
windows_v1.7.8+hotfix.4-stable.zip
• Extract zip file dan simpan flutter pada installation location Flutter SDK
(Contoh, C:\src\flutter; Jangan diletakan pada folder yang membutuhkan hak
akses sistem ! )
Sebelum kita membuat aplikasi dengan Flutter, kita perisksa dulu kesiapan peralatan
yang kita install.
– C:\src\flutter\flutter console
– Ketik :
• Flutter doctor
Biasanya akan ada saran link yang harus dibuka dan perintah yang harus
diketik. Error tersebut disebabkan karena saya belum menyetujui lisensi
Android SDK. Di sana saya diminta untuk mengetik perintah flutter doctor
--android-licences.
lib berisi source code Dart, di sini kita akan menulis kode aplikasi;
.packages merupakan file yang berisi alamat path package yang dibuat oleh
pub;
pubspec.lock merupakan file yang berisi versi-versi library atau package. File
ini dibuat oleh pub. Fungsinya untuk mengunci versi package.
@override
_MyHomePageState createState() => _MyHomePageState();
}
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
);
}
}
1. Bagian Import
Bagian import adalah tempat kita mendeklarasikan atau mengimpor library yang
dibutuhkan pada aplikasi.
2. Bagian Main
Bagian main adalah fungsi utama dari aplikasi yang akan menjadi entri point.
Fungsi ini akan dieksekusi pertama kali saat aplikasi dibuka.
3. Bagian Widget
Bagian widget adalah tempat kita membuat widget. Aplikasi Flutter sebenarnya
terdiri dari susunan widget. Widget bisa kita bilang elemen-elemen seperti
Tombol, Teks, Layaout, Image, dan sebagainya.
AppBar mungkin bisa disinonimkan dengan tag <header> pada HTML, sebab
AppBar merupakan fungsi untuk membuat head dari sebuah aplikasi, dimana
didalamnya terdapat title yang dapat digunakan untuk menampilkan brand atau
page apa yang sedang dibuka dari aplikasi tersebut.
Row() & Column() dapat digunakan untuk mengatur posisi dari widget yang akan
ditampilkan. Row sendiri berarti baris, maka apapun yang diapit oleh class ini
akan menggunakan posisi baris atau berderet kesamping (Horizontal). Sedang
Column berarti kolom, maka widget yang berada didalamnya akan tersusun
kebawah (Vertical).
import 'package:flutter/material.dart';
void main(){
runApp(new MaterialApp
title:"Layouts",
home: new HalamanSatu(),
));
actions : <Widget>[
new Icon(Icons.search)
]
),
body: new Container(
child : new Column(
children: <Widget>[
new Icon(
Icons.local_airport,
size:80 ,
color: Colors.white),
new Icon(Icons.donut_large,
size : 80,
color: Colors.red),
new Icon(Icons.add_call,
size : 80,
color: Colors.red),
new Row(
children: <Widget>[
new Icon(Icons.computer,
size : 80,
color: Colors.red),
new Icon(Icons.headset,
size : 80,
color: Colors.red),
],
),
new Icon(Icons.add_comment,
size : 80,
color: Colors.red),
],
)
)
);
}
}
import 'package:flutter/material.dart';
void main(){
runApp(new MaterialApp(
title:"Card & Passing Data",
home: new HalamanSatu(),
));
],
)
)
) ;
}
}
@Override
Widget build(BuildContext context){
return new Container(
padding: new EdgeInsets.all(10),
child: new Card(
child:
new Column(
children: <Widget>[
new Icon(icon, size: 50.0, color: warnaIcon,),
new Text(teks ,style: new TextStyle(fontSize:
20)),
],
)
),
);
}
}
Lab Perpindahan halaman (Intent)
-File Main.dart
import 'package:flutter/material.dart';
import './komputer.dart' as komputer;
import './laptop.dart' as laptop;
import './headset.dart' as headset;
void main(){
runApp(new MaterialApp(
home: new Home(),
title: "Tab Bar"
));
}
)
),
body: new TabBarView(
controller: controller,
children: <Widget>[
new komputer.Komputer(),
new laptop.Laptop(),
new headset.Headset(),
],
),
bottomNavigationBar: new Material(
color: Colors.red,
child: new TabBar(
controller: controller,
tabs: <Widget>[
new Tab(icon: new Icon(Icons.computer),),
new Tab(icon: new Icon(Icons.laptop),),
new Tab(icon: new Icon(Icons.headset),),
],
)
)
);
}
}
komputer.dart
import 'package:flutter/material.dart';
class Komputer extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: new Center(
child: new Column(
children: <Widget>[
new Padding(padding: new EdgeInsets.all(20),),
new Text("Halaman Computer", style: new
TextStyle(fontSize: 30)),
new Icon(Icons.computer,size:90),
],
)
)
);
}
}
laptop.dart
import 'package:flutter/material.dart';
class Laptop extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: new Center(
child: new Column(
children: <Widget>[
new Padding(padding: new EdgeInsets.all(20),),
new Text("Halaman Laptop", style: new
TextStyle(fontSize: 30)),
new Icon(Icons.laptop,size:90),
],
)
)
);
}
}
headset.dart
import 'package:flutter/material.dart';
class Headset extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: new Center(
child: new Column(
children: <Widget>[
new Padding(padding: new EdgeInsets.all(20),),
new Text("Halaman Headset", style: new
TextStyle(fontSize: 30)),
new Icon(Icons.headset,size:90),
],
)
)
);
}
}
ListView
ListView adalah tampilan beberapa item dalam bentuk list yang dapat di scroll
secara vertikal. Setiap item akan otomatis dimasukkan kedalam list menggunakan
Adapter yang datanya di ambil dari array/database/json/dsb. ListView sering
digunakan dalam aplikasi Android, seperti kontak, email, twitter, dsb.
Lab Adapter
import 'package:flutter/material.dart';
void main(){
runApp(new MaterialApp(
home: new Home(),
title: "List View"
));
}
import 'package:flutter/material.dart';
void main(){
runApp(new MaterialApp(
home: new Home(data: new List<String>.generate(300,
(i)=>"Data ke $i")),
title: "List View"
));
}
class Home extends StatelessWidget{
final List<String> data;
Home({this.data});
@override
Widget build(BuildContext context){
return new Scaffold(
appBar: new AppBar(title: new Text("List View")),
body: new Container(
child: new ListView.builder(
itemCount: data.length,
itemBuilder: (context,index){
return new ListTile(
leading: new Icon(Icons.widgets),
title: new Text("${data[index]}"),
);
}
),
)
);
}
}
JSON (JavaScript Object Notation) adalah format pertukaran data yang ringan,
mudah dibaca dan ditulis oleh manusia, serta mudah diterjemahkan dan dibuat
(generate) oleh komputer. Format ini dibuat berdasarkan bagian dari Bahasa
Pemprograman JavaScript, Standar ECMA-262 Edisi ke-3 - Desember 1999. JSON
merupakan format teks yang tidak bergantung pada bahasa pemprograman apapun
karena menggunakan gaya bahasa yang umum digunakan oleh programmer keluarga
C termasuk C, C++, C#, Java, JavaScript, Perl, Python dll. Oleh karena sifat-sifat
tersebut, menjadikan JSON ideal sebagai bahasa pertukaran-data.
Kumpulan pasangan nama/nilai. Pada beberapa bahasa, hal ini dinyatakan sebagai
objek (object), rekaman (record), struktur (struct), kamus (dictionary), tabel hash
(hash table), daftar berkunci (keyed list), atau associative array.
Daftar nilai terurutkan (an ordered list of values). Pada kebanyakan bahasa, hal ini
dinyatakan sebagai larik (array), vektor (vector), daftar (list), atau urutan (sequence).
Struktur-struktur data ini disebut sebagai struktur data universal. Pada dasarnya,
semua bahasa pemprograman moderen mendukung struktur data ini dalam bentuk
yang sama maupun berlainan. Hal ini pantas disebut demikian karena format data
mudah dipertukarkan dengan bahasa-bahasa pemprograman yang juga berdasarkan
pada struktur data ini.
Objek adalah sepasang nama/nilai yang tidak terurutkan. Objek dimulai dengan
{kurung kurawal buka dan diakhiri dengan }kurung kurawal tutup. Setiap nama
diikuti dengan :titik dua dan setiap pasangan nama/nilai dipisahkan oleh ,koma.
Larik adalah kumpulan nilai yang terurutkan. Larik dimulai dengan [kurung kotak
buka dan diakhiri dengan ]kurung kotak tutup. Setiap nilai dipisahkan oleh ,koma.
Nilai (value) dapat berupa sebuah string dalam tanda kutip ganda, atau angka, atau
true atau false atau null, atau sebuah objek atau sebuah larik. Struktur-struktur
tersebut dapat disusun bertingkat.
String adalah kumpulan dari nol atau lebih karakter Unicode, yang dibungkus
dengan tanda kutip ganda. Di dalam string dapat digunakan backslash escapes "\"
untuk membentuk karakter khusus. Sebuah karakter mewakili karakter tunggal pada
string. String sangat mirip dengan string C atau Java.
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:async';
import 'dart:convert';
void main(){
runApp(new MaterialApp(
home: new Home(),
title: "List View"
));
}
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
Uri.encodeFull("https://jsonplaceholder.typicode.com/posts"),hea
ders:{
"Accept":"application/json"
}
);
this.setState((){
dataJSON = json.decode(hasil.body);
});
}
@override
void initState(){
this.ambildata();
}
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(title: new Text("JSON Data"),),
body: new ListView.builder(
itemCount: dataJSON==null ? 0: dataJSON.length,
itemBuilder: (context,i){
return new Card(
child: new Text(
dataJSON[i]['title'],
style : new TextStyle(fontSize: 20,
color:Colors.redAccent)
)
);
},
)
);
}
}
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:async';
import 'dart:convert';
void main(){
runApp(new MaterialApp(
home: new Home(),
title: "List View"
));
}
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
Uri.encodeFull("https://jsonplaceholder.typicode.com/posts"),hea
ders:{
"Accept":"application/json"
}
);
this.setState((){
dataJSON = json.decode(hasil.body);
});
}
@override
void initState(){
this.ambildata();
}
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(title: new Text("JSON Data"),),
body: new ListView.builder(
itemCount: dataJSON==null ? 0: dataJSON.length,
itemBuilder: (context,i){
return
new Container(
padding: new EdgeInsets.all(10),
child:new Card(
child: new Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: <Widget>[
new Text(
dataJSON[i]['title'],
style : new TextStyle(fontSize:
20, color:Colors.blue)
),
new Text(
dataJSON[i]['body'],
style : new TextStyle(fontSize:
15, color:Colors.black)
)
],
)
),
);
},
)
);
}
}
Inputan, Alert dan Snackbar
TextField adalah widget input teks yang paling umum digunakan. Secara default,
TextField dihiasi dengan garis bawah. Anda dapat menambahkan label, ikon, teks
petunjuk sebaris, dan teks kesalahan dengan memasok InputDecoration sebagai
properti dekorasi dari TextField. Untuk menghapus dekorasi seluruhnya (termasuk
garis bawah dan ruang yang disediakan untuk label), atur dekorasi ke nol.
Alert Dialog adalah sebuah pop up yang muncul pada saat-saat tertentu dan
berfungsi untuk memberi info pada pengguna, berbentuk kotak. Pada tutorial ini kita
akan membuat Alert Dialog sederhana / bawaan dari Android, AlertDialog basic ini
berisi icon (default-nya kosong), title dialog, pesan yang ingin disampaikan dialog
itu, dan tombol “Yes” atau “No” yang bisa dicustom.
SnackBar adalah view baru yang ada di Android Material Design yang mempunyai
fungsi hampir sama seperti Toast, yaitu menampilkan informasi atau pesan singkat
untuk pengguna. Bedanya, SnackBar mempunyai posisi default pada bagian bawah
layar ketika tampil. Selain itu SnackBar tidak hanya memberikan informasi/pesan
kepada pengguna, namun SnackBar juga mempunyai tombol “Action” yang ketika
diklik oleh pengguna akan melakukan suatu aksi yang sudah kita definisikan
sebelumnya.
import 'package:flutter/material.dart';
void main(){
runApp(new MaterialApp(
home: new Home(),
title: "Input Text"
));
}
}
@override
new TextField(
controller: controllerSnack,
decoration: new InputDecoration(
hintText: "Snack Bar "
),
onSubmitted: (String str){
_snackbar(str);
controllerSnack.text="";
},
),
],
)
)
);
}
}
Navigation Drawer adalah panel yang menampilkan pilihan navigasi utama aplikasi
dari tepi kiri layar. Tersembunyi sebagian, tetapi menu akan muncul ketika
pengguna gesekan jari dari tepi kiri layar atau pengguna menyentuh ikon aplikasi di
bar untuk menampilkannya.
import 'package:flutter/material.dart';
void main(){
runApp(new MaterialApp(
home: new Home(),
title: "Input Text"
));
}
void gantiuser(){
this.setState((){
gambarx = gambar1;
gambar1 = gambar2;
gambar2 = gambarx;
namax = nama1;
nama1 = nama2;
nama2 = namax;
emailx = email1;
email1 = email2;
email2 = emailx;
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(title: new Text("Navigation
Drawer")),
drawer: new Drawer(
child: new ListView(
children: <Widget>[
new UserAccountsDrawerHeader(
accountName: new Text(nama1),
accountEmail: new Text(email1),
currentAccountPicture:
new CircleAvatar(
backgroundImage: new
NetworkImage(gambar1)),
otherAccountsPictures: <Widget>[
new GestureDetector(
onTap:()=> gantiuser(),
child : new
CircleAvatar(backgroundImage: new NetworkImage(gambar2),)
)
],
),
new ListTile(
title : new Text("Setting"),
trailing: new Icon(Icons.settings),
),
new ListTile(
title : new Text("Exit"),
trailing: new Icon(Icons.exit_to_app),
)
],
)
),
body: new Container(
)
);
}
}
Local Database menggunakan SQLite
Banyak opsi media penyimpanan yang bisa kita pakai untuk menyimpan data ke
dalam aplikasi Android, menggunakan database SQLite adalah salah satu opsi yang
paling serbaguna dan praktis untuk kita implementasikan.
Database SQLite adalah solusi penyimpanan yang baik jika anda memiliki data
terstruktur yang perlu diakses dan disimpan secara persisten serta sering ditelusuri
dan diubah. Anda juga bisa menggunakan SQLite sebagai media penyimpanan
utama untuk data aplikasi atau pengguna, atau anda juga bisa menggunakannya
untuk proses caching serta menyediakan data yang diambil dari cloud.
Secara umum, Flutter tidak menyediakan Class SQLite, Tetapi Flutter mendukung
modul open source SQFlite. SQFlite adalah cara menyimpan data aplikasi di
Aplikasi Flutter. SQFlite adalah plugin Database untuk flutter.
Pada Lab SQLite, kita akan Bersama – sama membuat beberapa file diantara lain
file untuk database helper, models, dan masing – masing file untuk operasi CRUD
user.dart
class User {
int id;
String _firstName;
String _lastName;
String _dob;
User.map(dynamic obj) {
this._firstName = obj["firstname"];
this._lastName = obj["lastname"];
this._dob = obj["dob"];
}
String get firstName => _firstName;
database_helper.dart
import 'dart:async';
import 'dart:io' as io;
import 'package:flutter_database/User.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
class DatabaseHelper {
static final DatabaseHelper _instance = new
DatabaseHelper.internal();
factory DatabaseHelper() => _instance;
static Database _db;
DatabaseHelper.internal();
initDb() async {
io.Directory documentsDirectory = await
getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, "main.db");
var theDb = await openDatabase(path, version: 1, onCreate:
_onCreate);
return theDb;
}
int res =
await dbClient.rawDelete('DELETE FROM User WHERE id = ?',
[user.id]);
return res;
}
add_user_dialog.dart
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_database/database_hepler.dart';
import 'package:flutter_database/User.dart';
class AddUserDialog {
final teFirstName = TextEditingController();
final teLastFirstName = TextEditingController();
final teDOB = TextEditingController();
User user;
Widget buildAboutDialog(
BuildContext context, _myHomePageState, bool isEdit, User
user) {
if (user != null) {
this.user=user;
teFirstName.text = user.firstName;
teLastFirstName.text = user.lastName;
teDOB.text = user.dob;
}
Widget getTextField(
String inputBoxName, TextEditingController
inputBoxController) {
var loginBtn = new Padding(
padding: const EdgeInsets.all(5.0),
child: new TextFormField(
controller: inputBoxController,
decoration: new InputDecoration(
hintText: inputBoxName,
),
),
);
return loginBtn;
}
list.dart
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_database/add_user_dialog.dart';
import 'package:flutter_database/User.dart';
import 'package:flutter_database/home_presenter.dart';
UserList(
List<User> this.country,
HomePresenter this.homePresenter, {
Key key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return new ListView.builder(
itemCount: country == null ? 0 : country.length,
itemBuilder: (BuildContext context, int index) {
return new Card(
child: new Container(
child: new Center(
child: new Row(
children: <Widget>[
new CircleAvatar(
radius: 30.0,
child: new
Text(getShortName(country[index])),
backgroundColor: const
Color(0xFF20283e),
),
new Expanded(
child: new Padding(
padding: EdgeInsets.all(10.0),
child: new Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: <Widget>[
new Text(
country[index].firstName +
" " +
country[index].lastName,
// set some style to text
style: new TextStyle(
fontSize: 20.0,
color:
Colors.lightBlueAccent),
),
new Text(
"DATE: " + country[index].dob,
// set some style to text
style: new TextStyle(
fontSize: 20.0, color:
Colors.amber),
),
],
),
),
),
new Column(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: <Widget>[
new IconButton(
icon: const Icon(
Icons.edit,
color: const Color(0xFF167F67),
),
onPressed: () =>
edit(country[index], context),
),
new IconButton(
icon: const
Icon(Icons.delete_forever,
color: const Color(0xFF167F67)),
onPressed: () =>
homePresenter.delete(country[index]),
),
],
),
],
),
),
padding: const EdgeInsets.fromLTRB(10.0, 0.0,
0.0, 0.0)),
);
});
}
displayRecord() {
homePresenter.updateScreen();
}
edit(User user, BuildContext context) {
showDialog(
context: context,
builder: (BuildContext context) =>
new AddUserDialog().buildAboutDialog(context, this,
true, user),
);
homePresenter.updateScreen();
}
home_presenter.dart
import 'package:flutter_database/database_hepler.dart';
import 'package:flutter_database/User.dart';
import 'dart:async';
class HomePresenter {
HomeContract _view;
var db = new DatabaseHelper();
HomePresenter(this._view);
delete(User user) {
var db = new DatabaseHelper();
db.deleteUsers(user);
updateScreen();
}
Future<List<User>> getUser() {
return db.getUser();
}
updateScreen() {
_view.screenUpdate();
}
}
homescreen.dart
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_database/add_user_dialog.dart';
import 'package:flutter_database/database_hepler.dart';
import 'package:flutter_database/User.dart';
import 'package:flutter_database/home_presenter.dart';
import 'package:flutter_database/list.dart';
@override
_MyHomePageState createState() => new _MyHomePageState();
}
@override
void initState() {
super.initState();
homePresenter = new HomePresenter(this);
}
displayRecord() {
setState(() {});
}
setState(() {});
}
List<Widget> _buildActions() {
return <Widget>[
new IconButton(
icon: const Icon(
Icons.group_add,
color: Colors.white,
),
onPressed: _openAddUserDialog,
),
];
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: _buildTitle(context),
actions: _buildActions(),
),
body: new FutureBuilder<List<User>>(
future: homePresenter.getUser(),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
var data = snapshot.data;
return snapshot.hasData
? new UserList(data,homePresenter)
: new Center(child: new
CircularProgressIndicator());
},
),
);
}
@override
void screenUpdate() {
setState(() {});
}
}
main.dart
import 'package:flutter/material.dart';
import 'package:flutter_database/homescreen.dart';
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Database',
debugShowCheckedModeBanner: false,
theme: new ThemeData(
primaryColor: const Color(0xFF02BB9F),
primaryColorDark: const Color(0xFF167F67),
accentColor: const Color(0xFFFFAD32),
),
home: new MyHomePage(title: 'Flutter Database'),
);
}
}
PHP MySQL RESTful API
Kekhasan REST terletak pada interaksi antara klien dan server yang difasilitasi oleh
sejumlah tipe operasional (verba) dan Universal Resource Identifiers (URIs) yang
unik bagi tiap-tiap sumberdaya. Masing-masing verba – GET, POST, PUT dan
DELETE – memiliki makna operasional khusus untuk menghindari ambiguitas.
REST kerap dipergunakan dalam mobile application, situs web jejaring sosial,
mashup tools, dan automated business processes.
Arsitektur REST yang decoupled (terpisah) serta beban komunikasi yang ringan
antara produsen dan konsumen membuatnya populer di dunia cloud-based API,
seperti yang disajikan oleh Amazon, Microsoft, dan Google.
Layanan berbasis web yang menggunakan arsitektur REST semacam itu dinamakan
RESTful APIs (Application Programming Interfaces) atau REST APIs.
Lab File REST
Buat database dengan nama db_store, kemudia buat table seperti dibawah ini
<?php
$connect = new mysqli("localhost","root","","my_store");
if($connect){
}else{
echo "Connection Failed";
exit();
}
?>
Adddata.php
<?php
include 'conn.php';
$itemcode = $_POST['itemcode'];
$itemname = $_POST['itemname'];
$price = $_POST['price'];
$stock= $_POST['stock'];
?>
Deletedata.php
<?php
include 'conn.php';
$id=$_POST['id'];
$connect->query("DELETE FROM tb_item WHERE id=".$id);
?>
Editdata.php
<?php
include 'conn.php';
$id = $_POST['id'];
$itemcode = $_POST['itemcode'];
$itemname = $_POST['itemname'];
$price = $_POST['price'];
$stock= $_POST['stock'];
?>
Getdata.php
<?php
include 'conn.php';
$result=array();
while($fetchData=$queryResult->fetch_assoc()){
$result[]=$fetchData;
}
echo json_encode($result);
?>
Kemudian cek apakah REST sudah berjalan dengan baik? Bisa menggunakan
beberapa tools WEB seperti POSTMAN
Lab Flutter – SQL
Main.dart
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import './detail.dart';
import './adddata.dart';
void main() {
runApp(new MaterialApp(
title: "My Store",
home: new Home(),
));
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("MY STORE"),
),
floatingActionButton: new FloatingActionButton(
child: new Icon(Icons.add),
onPressed: ()=>Navigator.of(context).push(
new MaterialPageRoute(
builder: (BuildContext context)=> new AddData(),
)
),
),
body: new FutureBuilder<List>(
future: getData(),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
return snapshot.hasData
? new ItemList(
list: snapshot.data,
)
: new Center(
child: new CircularProgressIndicator(),
);
},
),
);
}
}
@override
Widget build(BuildContext context) {
return new ListView.builder(
itemCount: list == null ? 0 : list.length,
itemBuilder: (context, i) {
return new Container(
padding: const EdgeInsets.all(10.0),
child: new GestureDetector(
onTap: ()=>Navigator.of(context).push(
new MaterialPageRoute(
builder: (BuildContext context)=> new
Detail(list:list , index: i,)
)
),
child: new Card(
adddata.dart
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
void addData(){
var url="http://192.168.1.247/rest/adddata.php";
http.post(url, body: {
"itemcode": controllerCode.text,
"itemname": controllerName.text,
"price": controllerPrice.text,
"stock": controllerStock.text
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("ADD DATA"),
),
body: Padding(
padding: const EdgeInsets.all(10.0),
child: ListView(
children: <Widget>[
new Column(
children: <Widget>[
new TextField(
controller: controllerCode,
decoration: new InputDecoration(
hintText: "Item Code", labelText: "Item
Code"),
),
new TextField(
controller: controllerName,
decoration: new InputDecoration(
hintText: "Item Name", labelText: "Item
Name"),
),
new TextField(
controller: controllerPrice,
decoration: new InputDecoration(
hintText: "Price", labelText: "Price"),
),
new TextField(
controller: controllerStock,
decoration: new InputDecoration(
hintText: "Stock", labelText: "Stock"),
),
new Padding(
padding: const EdgeInsets.all(10.0),
),
new RaisedButton(
child: new Text("ADD DATA"),
color: Colors.blueAccent,
onPressed: () {
addData();
Navigator.pop(context);
},
)
],
),
],
),
),
);
}
}
detail.dart
import 'package:flutter/material.dart';
import './editdata.dart';
import 'package:http/http.dart' as http;
import './main.dart';
void deleteData(){
var url="http://192.168.1.247/rest/deleteData.php";
http.post(url, body: {
'id': widget.list[widget.index]['id']
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(title: new
Text("${widget.list[widget.index]['item_name']}")),
body: new Container(
height: 270.0,
padding: const EdgeInsets.all(20.0),
child: new Card(
child: new Center(
child: new Column(
children: <Widget>[
new Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
new RaisedButton(
child: new Text("EDIT"),
color: Colors.green,
onPressed: ()=>Navigator.of(context).push(
new MaterialPageRoute(
builder: (BuildContext context)=>new
EditData(list: widget.list, index: widget.index,),
)
),
),
new RaisedButton(
child: new Text("DELETE"),
color: Colors.red,
onPressed: ()=>confirm(),
),
],
)
],
),
),
),
),
);
}
}
editdata.dart
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import './main.dart';
EditData({this.list, this.index});
@override
_EditDataState createState() => new _EditDataState();
}
TextEditingController controllerCode;
TextEditingController controllerName;
TextEditingController controllerPrice;
TextEditingController controllerStock;
void editData() {
var url="http://192.168.1.247/rest/editdata.php";
http.post(url,body: {
"id": widget.list[widget.index]['id'],
"itemcode": controllerCode.text,
"itemname": controllerName.text,
"price": controllerPrice.text,
"stock": controllerStock.text
});
}
@override
void initState() {
controllerCode= new TextEditingController(text:
widget.list[widget.index]['item_code'] );
controllerName= new TextEditingController(text:
widget.list[widget.index]['item_name'] );
controllerPrice= new TextEditingController(text:
widget.list[widget.index]['price'] );
controllerStock= new TextEditingController(text:
widget.list[widget.index]['stock'] );
super.initState();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("EDIT DATA"),
),
body: Padding(
padding: const EdgeInsets.all(10.0),
child: ListView(
children: <Widget>[
new Column(
children: <Widget>[
new TextField(
controller: controllerCode,
decoration: new InputDecoration(
hintText: "Item Code", labelText: "Item
Code"),
),
new TextField(
controller: controllerName,
decoration: new InputDecoration(
hintText: "Item Name", labelText: "Item
Name"),
),
new TextField(
controller: controllerPrice,
decoration: new InputDecoration(
hintText: "Price", labelText: "Price"),
),
new TextField(
controller: controllerStock,
decoration: new InputDecoration(
hintText: "Stock", labelText: "Stock"),
),
new Padding(
padding: const EdgeInsets.all(10.0),
),
new RaisedButton(
child: new Text("EDIT DATA"),
color: Colors.blueAccent,
onPressed: () {
editData();
Navigator.of(context).push(
new MaterialPageRoute(
builder: (BuildContext context)=>new
Home()
)
);
},
)
],
),
],
),
),
);
}
}
PDF Viewers
Kita akan coba menggunakan Flutter untuk membuat aplikasi yang dapat
membuka PDF dengan menekan tombol. Pertama kita akan menggunakan paket
Dart untuk menyajikan PDF. Di bawah ini Anda akan melihat langkah-langkah
cara membuka PDF di Flutter dengan flutter_full_pdf_viewer.
2. Buat folder assets dan folder pdfs didalamnya, kemudian daftarkan assets
pada file pubspec.yaml
flutter:
assets:
- PDFs/
3. Kemudian jalankan perintah flutter packages get pada CMD
4. Ketik perintah dibawah ini pada file dart anda
5. import 'dart:io';
6. import 'dart:typed_data';
7.
8. import 'package:flutter/material.dart';
9. import 'package:flutter_full_pdf_viewer/full_pdf_viewer_scaffold.dart';
10. import 'package:path_provider/path_provider.dart';
11.
12. // Change this to fit the PDF file you are using to test.
13. const String _documentPath = 'PDFs/Guide-v4.pdf';
14.
15. void main() => runApp(MyApp());
16.
17. class MyApp extends StatelessWidget {
18. @override
19. Widget build(BuildContext context) {
20. return MaterialApp(
21. title: 'Opening a PDF',
22. theme: ThemeData(
23. primarySwatch: Colors.blue,
24. ),
25. home: MyHomePage(),
26. );
27. }
28. }
29.
30. class MyHomePage extends StatefulWidget {
31. MyHomePage({Key key}) : super(key: key);
32.
33. @override
34. _MyHomePageState createState() => _MyHomePageState();
35. }
36.
37. class _MyHomePageState extends State<MyHomePage> {
38. // This moves the PDF file from the assets to a place accessible by our
PDF viewer.
39. Future<String> prepareTestPdf() async {
40. final ByteData bytes =
41. await DefaultAssetBundle.of(context).load(_documentPath);
42. final Uint8List list = bytes.buffer.asUint8List();
43.
44. final tempDir = await getTemporaryDirectory();
45. final tempDocumentPath = '${tempDir.path}/$_documentPath';
46.
47. final file = await File(tempDocumentPath).create(recursive: true);
48. file.writeAsBytesSync(list);
49. return tempDocumentPath;
50. }
51.
52. @override
53. Widget build(BuildContext context) {
54. return Scaffold(
55. appBar: AppBar(
56. title: Text("Opening a PDF"),
57. ),
58. body: Center(
59. child: Column(
60. mainAxisAlignment: MainAxisAlignment.center,
61. children: <Widget>[
62. RaisedButton(
63. onPressed: () {},
64. child: const Text('Open PDF with full_pdf_viewer'),
65. ),
66. ],
67. ),
68. ),
69. );
70. }
71. }
72.
Deploy Signing APK