1
0
mirror of https://github.com/flutter/samples.git synced 2025-11-08 22:09:06 +00:00

Initial Commit for PlaformChannel Sample App (#453)

This commit is contained in:
Ayush Bherwani
2020-06-05 03:24:52 +05:30
committed by GitHub
parent 8fbe1d6366
commit acf700c642
67 changed files with 1805 additions and 0 deletions

View File

@@ -0,0 +1,70 @@
// Copyright 2020 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/material.dart';
import 'package:platform_channels/src/method_channel_demo.dart';
void main() {
runApp(PlatformChannelSample());
}
class PlatformChannelSample extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
routes: {
'/methodChannelDemo': (context) => MethodChannelDemo(),
},
title: 'Platform Channel Sample',
home: HomePage(),
);
}
}
class DemoInfo {
final String demoTitle;
final String demoRoute;
DemoInfo(this.demoTitle, this.demoRoute)
: assert(demoTitle != null),
assert(demoRoute != null);
}
List<DemoInfo> demoList = [
DemoInfo(
'MethodChannelDemo',
'/methodChannelDemo',
),
];
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Platform Channel Sample'),
),
body: ListView(
children: demoList.map((demoInfo) => DemoTile(demoInfo)).toList(),
),
);
}
}
/// This widget is responsible for displaying the [ListTile] on [HomePage].
class DemoTile extends StatelessWidget {
final DemoInfo demoInfo;
DemoTile(this.demoInfo);
@override
Widget build(BuildContext context) {
return ListTile(
title: Text(demoInfo.demoTitle),
onTap: () {
Navigator.pushNamed(context, demoInfo.demoRoute);
},
);
}
}

View File

@@ -0,0 +1,29 @@
// Copyright 2020 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/services.dart';
/// This class includes implementation of two platform methods [increment],
/// and [decrement] which are used to increment and decrement value
/// of count respectively.
class Counter {
/// Creates a [MethodChannel] with the specified name to invoke platform method.
/// In order to communicate across platforms, the name of MethodChannel
/// should be same on native and dart side.
static MethodChannel methodChannel = const MethodChannel('methodChannelDemo');
/// This method is responsible to increment and return the value of count.
static Future<int> increment({int counterValue}) async {
final result = await methodChannel
.invokeMethod<int>('increment', {'count': counterValue});
return result;
}
/// This method is responsible to decrement and return the value of count.
static Future<int> decrement({int counterValue}) async {
final result = await methodChannel
.invokeMethod<int>('decrement', {'count': counterValue});
return result;
}
}

View File

@@ -0,0 +1,91 @@
// Copyright 2020 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/material.dart';
import 'package:platform_channels/src/counter_method_channel.dart';
/// The widget demonstrates how to use [MethodChannel] to invoke platform methods.
/// It has two [RaisedButton]s to increment and decrement the value of
/// [count], and a [Text] widget to display its value.
class MethodChannelDemo extends StatefulWidget {
@override
_MethodChannelDemoState createState() => _MethodChannelDemoState();
}
class _MethodChannelDemoState extends State<MethodChannelDemo> {
int count = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('MethodChannel Demo'),
),
body: Builder(
builder: (context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Value of count is $count',
style: Theme.of(context).textTheme.headline5,
),
SizedBox(
height: 16,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// Whenever users press the RaisedButton, it invokes
// Counter.increment method to increment the value of count.
RaisedButton.icon(
onPressed: () async {
try {
final value =
await Counter.increment(counterValue: count);
setState(() => count = value);
} catch (error) {
showErrorMessage(
context,
error.message as String,
);
}
},
icon: Icon(Icons.add),
label: Text('Increment'),
),
// Whenever users press the RaisedButton, it invokes
// Counter.decrement method to decrement the value of count.
RaisedButton.icon(
onPressed: () async {
try {
final value =
await Counter.decrement(counterValue: count);
setState(() => count = value);
} catch (error) {
showErrorMessage(
context,
error.message as String,
);
}
},
icon: Icon(Icons.remove),
label: Text('Decrement'),
)
],
)
],
);
},
),
);
}
void showErrorMessage(BuildContext context, String errorMessage) {
Scaffold.of(context).showSnackBar(SnackBar(
content: Text(errorMessage),
));
}
}