· 6 years ago · Sep 04, 2019, 01:46 AM
1import 'dart:async';
2import 'package:flutter/material.dart';
3import 'package:flutter_woocommerce/screens/produtcs.dart';
4import 'package:woocommerce_api/woocommerce_api.dart';
5import 'package:intl/intl.dart';
6import 'utils/format.dart';
7
8void main() => runApp(MyApp());
9
10class MyApp extends StatelessWidget {
11 // This widget is the root of your application.
12 @override
13 Widget build(BuildContext context) {
14 return MaterialApp(
15 title: 'Flutter DroneLivre',
16 theme: ThemeData(
17 primarySwatch: Colors.amber,
18 ),
19 home: MyHomePage(title: 'Flutter Woocommerce App'),
20 debugShowCheckedModeBanner: false,
21 );
22 }
23
24}
25
26class MyHomePage extends StatefulWidget {
27 MyHomePage({Key key, this.title}) : super(key: key);
28
29 final String title;
30
31 @override
32 _MyHomePageState createState() => _MyHomePageState();
33
34}
35
36class _MyHomePageState extends State<MyHomePage> {
37
38 /// Initialize the API
39 WooCommerceAPI droneLivre = new WooCommerceAPI(
40 "https://www.dronelivre.com.br",
41 "ck_cb7ff7b20a09e6eb2c3139c96c8481b79514edad",
42 "cs_ffbdfd5e889e623ff18f557c5647c7564951b8df");
43
44 int pageNumber = 1;
45
46 ScrollController _scrollController = new ScrollController();
47
48 bool isLoading = false;
49
50 String nextPage = "products?&page=1";
51
52 List<dynamic> products = List();
53
54 Future getMoreData() async {
55 Intl.defaultLocale = 'pt_BR';
56
57 if (!isLoading) {
58 setState(() {
59 isLoading = true;
60 });
61
62
63 List<dynamic> tempList = List();
64 nextPage = "products?&page="+(pageNumber++).toString();
65 tempList.add(await droneLivre.getAsync(nextPage));
66
67 setState(() {
68 isLoading = false;
69 products.addAll(tempList);
70 });
71
72 print(products);
73 return products;
74
75 }
76 }
77
78 @override
79 void initState() {
80 this.getMoreData();
81 super.initState();
82 _scrollController.addListener(() {
83 if (_scrollController.position.pixels ==
84 _scrollController.position.maxScrollExtent) {
85 getMoreData();
86 }
87 });
88 }
89
90 Widget _buildProgressIndicator() {
91 return new Padding(
92 padding: const EdgeInsets.all(8.0),
93 child: new Center(
94 child: new Opacity(
95 opacity: isLoading ? 1.0 : 00,
96 child: new CircularProgressIndicator(),
97 ),
98 ),
99 );
100 }
101
102 @override
103 Widget build(BuildContext context) {
104 return new Scaffold(
105 appBar: new AppBar(
106 title: new Text(widget.title),
107 ),
108 body: FutureBuilder(
109 future: getMoreData(),
110 builder: (_, s){
111 if(s.data == null){
112 return Container(
113 child: Center(
114 child: _buildProgressIndicator(),
115 ),
116 );
117 }
118 return Column(
119 children: <Widget>[
120 Expanded(
121 child: _criaListaProdutos(_,s),
122 ),
123 ],
124 );
125 },
126 ),
127 );
128 }
129
130//Widget da criação da lista de produtos
131 Widget _criaListaProdutos(_,s){
132 return ListView.builder(
133 itemCount: products.length,
134 itemBuilder: (context, index){
135
136 return InkWell(
137 onTap: () {
138 Navigator.push(context,
139 MaterialPageRoute(builder: (context) => ProductPage(s.data[index])));
140 },
141 child: Column(
142 children: <Widget>[
143 Row(
144 children: <Widget>[
145 Padding(
146 padding: EdgeInsets.all(0.0),
147 child: Container(
148 margin: EdgeInsets.all(16.0),
149 child: Container(
150 width: 70.0,
151 height: 70.0,
152 ),
153 decoration: BoxDecoration(
154 borderRadius: BorderRadius.circular(10.0),
155 color: Colors.grey,
156 image: DecorationImage(
157 image: NetworkImage(s.data[index]["images"][0]["src"]),
158 fit: BoxFit.cover),
159 boxShadow: [
160 BoxShadow(
161 color: Colors.amber,
162 blurRadius: 5.0,
163 offset: Offset(2.0, 5.0))
164 ],
165 ),
166 ),
167 ),
168 Expanded(
169 child: Container(
170 margin: EdgeInsets.fromLTRB(16.0,0.0,16.0,0.0),
171 child: Column(
172 children: [
173 Text(
174 s.data[index]["name"],
175 style: TextStyle(
176 fontSize: 20.0,
177 fontFamily: 'Arvo',
178 fontWeight: FontWeight.bold,
179 color: Colors.amber),
180 ),
181 Padding(padding: EdgeInsets.all(2.0)),
182 Text(formatMoney(double.tryParse(s.data[index]["price"]) ?? 0.0),
183 maxLines: 3,
184 style: TextStyle(
185 color: Colors.black,
186 fontSize: 16,
187 fontFamily: 'Arvo'
188 ),
189 ),
190 ],
191 crossAxisAlignment: CrossAxisAlignment.start,),
192 )
193 ),
194 ],
195 ),
196 Container(
197 width: 300.0,
198 height: 0.5,
199 color: Color(0xD2D2E1ff),
200 margin: const EdgeInsets.all(16.0),
201 )
202 ],
203 ),
204 );
205 },
206 controller: _scrollController,
207 );
208 }
209
210}