| // Copyright 2016 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| import 'dart:async'; |
| import 'dart:convert'; |
| import 'dart:io'; |
| |
| import 'package:flutter/material.dart'; |
| |
| import 'keys.dart'; |
| |
| const String getCounterUrl = 'http://baku-shared-counter.appspot.com/get_count'; |
| const String decreaseCounterUrl = 'http://baku-shared-counter.appspot.com/dec_count'; |
| |
| void main() { |
| runApp( |
| new MaterialApp( |
| title: 'Decrease Counter', |
| theme: new ThemeData( |
| primarySwatch: Colors.blue |
| ), |
| home: new MultiCounter() |
| ) |
| ); |
| } |
| |
| class MultiCounter extends StatefulWidget { |
| MultiCounter({ Key key }) : super(key: key); |
| |
| @override |
| _MultiCounterState createState() => new _MultiCounterState(); |
| } |
| |
| class _MultiCounterState extends State<MultiCounter> { |
| int _counter = 0; |
| |
| @override |
| void initState() { |
| super.initState(); |
| listenToGetCounter(); |
| } |
| |
| Future<Null> listenToGetCounter() async { |
| while (true) { |
| pingUrlAsync(getCounterUrl); |
| await new Future<Null>.delayed(new Duration(milliseconds: 500)); |
| } |
| } |
| |
| Future<Null> pingUrlAsync(String url) async { |
| HttpClient client = new HttpClient(); |
| HttpClientRequest request = await client.getUrl(Uri.parse(url)); |
| HttpClientResponse response = await request.close(); |
| response.transform(new Utf8Decoder()).listen((String body) { |
| updateCounter(JSON.decode(body)['count']); |
| }); |
| } |
| |
| void updateCounter(int counter) { |
| setState(() { |
| _counter = counter; |
| }); |
| } |
| |
| void _decreaseCounter() { |
| setState(() { |
| pingUrlAsync(decreaseCounterUrl); |
| }); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| final TextTheme textTheme = Theme.of(context).textTheme; |
| return new Scaffold( |
| appBar: new AppBar( |
| title: new Text('Multi Counter') |
| ), |
| body: new Center( |
| child: new Text( |
| 'Button tapped $_counter time${ _counter >= -1 && _counter <=1 ? '' : 's' }.', |
| style: textTheme.display3, |
| key: new ValueKey(textKey) |
| ) |
| ), |
| floatingActionButton: new FloatingActionButton( |
| key: new ValueKey(buttonKey), |
| onPressed: _decreaseCounter, |
| tooltip: 'Decrement', |
| child: new Icon(Icons.cancel) |
| ) |
| ); |
| } |
| } |