Reorged android_view to match the rest of the projects. (#740)
@ -0,0 +1,4 @@
|
|||||||
|
# android_view
|
||||||
|
|
||||||
|
An example of an Android app that integrates a Flutter add-to-app module at a
|
||||||
|
view level. For more information see [../README.md](../README.md).
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.7 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
@ -1,6 +1,6 @@
|
|||||||
#Fri Dec 18 11:51:17 PST 2020
|
#Fri Dec 18 11:51:17 PST 2020
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
@ -0,0 +1,42 @@
|
|||||||
|
.DS_Store
|
||||||
|
.dart_tool/
|
||||||
|
|
||||||
|
.packages
|
||||||
|
.pub/
|
||||||
|
|
||||||
|
.idea/
|
||||||
|
.vagrant/
|
||||||
|
.sconsign.dblite
|
||||||
|
.svn/
|
||||||
|
|
||||||
|
*.swp
|
||||||
|
profile
|
||||||
|
|
||||||
|
DerivedData/
|
||||||
|
|
||||||
|
.generated/
|
||||||
|
|
||||||
|
*.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
|
||||||
|
!default.pbxuser
|
||||||
|
!default.mode1v3
|
||||||
|
!default.mode2v3
|
||||||
|
!default.perspectivev3
|
||||||
|
|
||||||
|
xcuserdata
|
||||||
|
|
||||||
|
*.moved-aside
|
||||||
|
|
||||||
|
*.pyc
|
||||||
|
*sync/
|
||||||
|
Icon?
|
||||||
|
.tags*
|
||||||
|
|
||||||
|
build/
|
||||||
|
.android/
|
||||||
|
.ios/
|
||||||
|
.flutter-plugins
|
||||||
|
.flutter-plugins-dependencies
|
@ -0,0 +1,10 @@
|
|||||||
|
# This file tracks properties of this Flutter project.
|
||||||
|
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||||
|
#
|
||||||
|
# This file should be version controlled and should not be manually edited.
|
||||||
|
|
||||||
|
version:
|
||||||
|
revision: 532a8fed41a4f6595965f02f3edf9666ba5ebf44
|
||||||
|
channel: master
|
||||||
|
|
||||||
|
project_type: module
|
@ -0,0 +1,14 @@
|
|||||||
|
# flutter_module_using_plugin
|
||||||
|
|
||||||
|
An example Flutter module that uses a native plugin, intended for use in the
|
||||||
|
Flutter add-to-app samples. For more information on how to use it, see the
|
||||||
|
[README.md](../README.md) parent directory.
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
For more information about Flutter, check out
|
||||||
|
[flutter.dev](https://flutter.dev).
|
||||||
|
|
||||||
|
For instructions on how to integrate Flutter modules into your existing
|
||||||
|
applications, see Flutter's
|
||||||
|
[add-to-app documentation](https://flutter.dev/docs/development/add-to-app).
|
@ -0,0 +1,136 @@
|
|||||||
|
// Copyright 2019 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 'dart:math';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:sensors/sensors.dart';
|
||||||
|
|
||||||
|
// This is on alternate entrypoint for this module to display Flutter UI in
|
||||||
|
// a (multi-)view integration scenario.
|
||||||
|
void main() {
|
||||||
|
runApp(Cell());
|
||||||
|
}
|
||||||
|
|
||||||
|
class Cell extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
State<StatefulWidget> createState() => new _CellState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _CellState extends State<Cell> with WidgetsBindingObserver {
|
||||||
|
static const double gravity = 9.81;
|
||||||
|
static final AccelerometerEvent defaultPosition = AccelerometerEvent(0, 0, 0);
|
||||||
|
|
||||||
|
int cellNumber = 0;
|
||||||
|
Random _random;
|
||||||
|
AppLifecycleState appLifecycleState;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
final channel = MethodChannel('dev.flutter.example/cell');
|
||||||
|
channel.setMethodCallHandler((MethodCall call) async {
|
||||||
|
if (call.method == 'setCellNumber') {
|
||||||
|
setState(() {
|
||||||
|
cellNumber = call.arguments as int;
|
||||||
|
_random = Random(cellNumber);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// Keep track of what the current platform lifecycle state is.
|
||||||
|
WidgetsBinding.instance.addObserver(this);
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
WidgetsBinding.instance.removeObserver(this);
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void didChangeAppLifecycleState(AppLifecycleState state) {
|
||||||
|
setState(() {
|
||||||
|
appLifecycleState = state;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show a random bright color.
|
||||||
|
Color randomLightColor() {
|
||||||
|
_random ??= Random(cellNumber);
|
||||||
|
|
||||||
|
return Color.fromARGB(255, _random.nextInt(50) + 205,
|
||||||
|
_random.nextInt(50) + 205, _random.nextInt(50) + 205);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return MaterialApp(
|
||||||
|
// The Flutter cells will be noticeably different (due to background color
|
||||||
|
// and the Flutter logo). The banner breaks immersion.
|
||||||
|
debugShowCheckedModeBanner: false,
|
||||||
|
home: Container(
|
||||||
|
color: Colors.white,
|
||||||
|
child: Builder(
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return Card(
|
||||||
|
// Mimic the platform Material look.
|
||||||
|
margin: EdgeInsets.symmetric(horizontal: 36, vertical: 24),
|
||||||
|
shape: RoundedRectangleBorder(
|
||||||
|
borderRadius: BorderRadius.circular(16),
|
||||||
|
),
|
||||||
|
elevation: 16,
|
||||||
|
color: randomLightColor(),
|
||||||
|
child: Stack(
|
||||||
|
children: [
|
||||||
|
Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
// Show a number provided by the platform based on
|
||||||
|
// the cell's index.
|
||||||
|
cellNumber.toString(),
|
||||||
|
style: Theme.of(context).textTheme.headline3,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
left: 42,
|
||||||
|
top: 0,
|
||||||
|
bottom: 0,
|
||||||
|
child: Opacity(
|
||||||
|
opacity: 0.2,
|
||||||
|
child: StreamBuilder(
|
||||||
|
// Don't continuously rebuild for nothing when the
|
||||||
|
// cell isn't visible.
|
||||||
|
stream: appLifecycleState == AppLifecycleState.resumed
|
||||||
|
? accelerometerEvents
|
||||||
|
: Stream.value(defaultPosition),
|
||||||
|
initialData: defaultPosition,
|
||||||
|
builder: (BuildContext context,
|
||||||
|
AsyncSnapshot<AccelerometerEvent> snapshot) {
|
||||||
|
return Transform(
|
||||||
|
// Figure out the phone's orientation relative
|
||||||
|
// to gravity's direction. Ignore the z vector.
|
||||||
|
transform: Matrix4.rotationX(
|
||||||
|
snapshot.data.y / gravity * pi / 2)
|
||||||
|
..multiply(Matrix4.rotationY(
|
||||||
|
snapshot.data.x / gravity * pi / 2)),
|
||||||
|
alignment: Alignment.center,
|
||||||
|
child: FlutterLogo(size: 72));
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,184 @@
|
|||||||
|
// Copyright 2019 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:flutter/services.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:url_launcher/url_launcher.dart' as launcher;
|
||||||
|
|
||||||
|
import 'cell.dart';
|
||||||
|
|
||||||
|
/// The entrypoint for the flutter module.
|
||||||
|
void main() {
|
||||||
|
// This call ensures the Flutter binding has been set up before creating the
|
||||||
|
// MethodChannel-based model.
|
||||||
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
|
final model = CounterModel();
|
||||||
|
|
||||||
|
runApp(
|
||||||
|
ChangeNotifierProvider.value(
|
||||||
|
value: model,
|
||||||
|
child: MyApp(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// This is on alternate entrypoint for this module to display Flutter UI in
|
||||||
|
/// a (multi-)view integration scenario.
|
||||||
|
// This is unfortunately in this file due to
|
||||||
|
// https://github.com/flutter/flutter/issues/72630.
|
||||||
|
void showCell() {
|
||||||
|
runApp(Cell());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A simple model that uses a [MethodChannel] as the source of truth for the
|
||||||
|
/// state of a counter.
|
||||||
|
///
|
||||||
|
/// Rather than storing app state data within the Flutter module itself (where
|
||||||
|
/// the native portions of the app can't access it), this module passes messages
|
||||||
|
/// back to the containing app whenever it needs to increment or retrieve the
|
||||||
|
/// value of the counter.
|
||||||
|
class CounterModel extends ChangeNotifier {
|
||||||
|
CounterModel() {
|
||||||
|
_channel.setMethodCallHandler(_handleMessage);
|
||||||
|
_channel.invokeMethod('requestCounter');
|
||||||
|
}
|
||||||
|
|
||||||
|
final _channel = MethodChannel('dev.flutter.example/counter');
|
||||||
|
|
||||||
|
int _count = 0;
|
||||||
|
|
||||||
|
int get count => _count;
|
||||||
|
|
||||||
|
void increment() {
|
||||||
|
_channel.invokeMethod('incrementCounter');
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<dynamic> _handleMessage(MethodCall call) async {
|
||||||
|
if (call.method == 'reportCounter') {
|
||||||
|
_count = call.arguments as int;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The "app" displayed by this module.
|
||||||
|
///
|
||||||
|
/// It offers two routes, one suitable for displaying as a full screen and
|
||||||
|
/// another designed to be part of a larger UI.
|
||||||
|
class MyApp extends StatelessWidget {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return MaterialApp(
|
||||||
|
title: 'Flutter Module Title',
|
||||||
|
routes: {
|
||||||
|
'/': (context) => FullScreenView(),
|
||||||
|
'/mini': (context) => Contents(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Wraps [Contents] in a Material [Scaffold] so it looks correct when displayed
|
||||||
|
/// full-screen.
|
||||||
|
class FullScreenView extends StatelessWidget {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: Text('Full-screen Flutter with plugin'),
|
||||||
|
),
|
||||||
|
body: const Contents(showExit: true),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The actual content displayed by the module.
|
||||||
|
///
|
||||||
|
/// This widget displays info about the state of a counter and how much room (in
|
||||||
|
/// logical pixels) it's been given. It also offers buttons to increment the
|
||||||
|
/// counter, opening the Flutter documentation via the url_launcher plugin, and
|
||||||
|
/// (optionally) close the Flutter view.
|
||||||
|
class Contents extends StatelessWidget {
|
||||||
|
final bool showExit;
|
||||||
|
|
||||||
|
const Contents({this.showExit = false});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final mediaInfo = MediaQuery.of(context);
|
||||||
|
|
||||||
|
return SizedBox.expand(
|
||||||
|
child: Stack(
|
||||||
|
children: [
|
||||||
|
Positioned.fill(
|
||||||
|
child: DecoratedBox(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Theme.of(context).scaffoldBackgroundColor,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Positioned.fill(
|
||||||
|
child: Opacity(
|
||||||
|
opacity: .25,
|
||||||
|
child: FittedBox(
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
child: FlutterLogo(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
'Window is ${mediaInfo.size.width.toStringAsFixed(1)} x '
|
||||||
|
'${mediaInfo.size.height.toStringAsFixed(1)}',
|
||||||
|
style: Theme.of(context).textTheme.headline5,
|
||||||
|
),
|
||||||
|
SizedBox(height: 16),
|
||||||
|
Consumer<CounterModel>(
|
||||||
|
builder: (context, model, child) {
|
||||||
|
return Text(
|
||||||
|
'Taps: ${model.count}',
|
||||||
|
style: Theme.of(context).textTheme.headline5,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
SizedBox(height: 16),
|
||||||
|
Consumer<CounterModel>(
|
||||||
|
builder: (context, model, child) {
|
||||||
|
return ElevatedButton(
|
||||||
|
onPressed: () => model.increment(),
|
||||||
|
child: Text('Tap me!'),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () async {
|
||||||
|
// Use the url_launcher plugin to open the Flutter docs in
|
||||||
|
// a browser.
|
||||||
|
final url = 'https://flutter.dev/docs';
|
||||||
|
if (await launcher.canLaunch(url)) {
|
||||||
|
launcher.launch(url);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Text('Open Flutter Docs'),
|
||||||
|
),
|
||||||
|
if (showExit) ...[
|
||||||
|
SizedBox(height: 16),
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () => SystemNavigator.pop(),
|
||||||
|
child: Text('Exit this screen'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,229 @@
|
|||||||
|
# Generated by pub
|
||||||
|
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||||
|
packages:
|
||||||
|
async:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: async
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.5.0"
|
||||||
|
boolean_selector:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: boolean_selector
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.0"
|
||||||
|
characters:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: characters
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.0"
|
||||||
|
charcode:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: charcode
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.2.0"
|
||||||
|
clock:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: clock
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.0"
|
||||||
|
collection:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: collection
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.15.0"
|
||||||
|
fake_async:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: fake_async
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.2.0"
|
||||||
|
flutter:
|
||||||
|
dependency: "direct main"
|
||||||
|
description: flutter
|
||||||
|
source: sdk
|
||||||
|
version: "0.0.0"
|
||||||
|
flutter_test:
|
||||||
|
dependency: "direct dev"
|
||||||
|
description: flutter
|
||||||
|
source: sdk
|
||||||
|
version: "0.0.0"
|
||||||
|
flutter_web_plugins:
|
||||||
|
dependency: transitive
|
||||||
|
description: flutter
|
||||||
|
source: sdk
|
||||||
|
version: "0.0.0"
|
||||||
|
js:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: js
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.6.3"
|
||||||
|
matcher:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: matcher
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.12.10"
|
||||||
|
meta:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: meta
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.3.0"
|
||||||
|
nested:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: nested
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.0.4"
|
||||||
|
path:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: path
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.8.0"
|
||||||
|
plugin_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: plugin_platform_interface
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.3"
|
||||||
|
provider:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: provider
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "4.3.2+3"
|
||||||
|
sensors:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: sensors
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.4.2+6"
|
||||||
|
sky_engine:
|
||||||
|
dependency: transitive
|
||||||
|
description: flutter
|
||||||
|
source: sdk
|
||||||
|
version: "0.0.99"
|
||||||
|
source_span:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: source_span
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.8.1"
|
||||||
|
stack_trace:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: stack_trace
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.10.0"
|
||||||
|
stream_channel:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: stream_channel
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.0"
|
||||||
|
string_scanner:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: string_scanner
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.1.0"
|
||||||
|
term_glyph:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: term_glyph
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.2.0"
|
||||||
|
test_api:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: test_api
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.2.19"
|
||||||
|
typed_data:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: typed_data
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.3.0"
|
||||||
|
url_launcher:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: url_launcher
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "5.7.10"
|
||||||
|
url_launcher_linux:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: url_launcher_linux
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.0.1+4"
|
||||||
|
url_launcher_macos:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: url_launcher_macos
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.0.1+9"
|
||||||
|
url_launcher_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: url_launcher_platform_interface
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.9"
|
||||||
|
url_launcher_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: url_launcher_web
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.5+1"
|
||||||
|
url_launcher_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: url_launcher_windows
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.0.1+3"
|
||||||
|
vector_math:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: vector_math
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.1.0"
|
||||||
|
sdks:
|
||||||
|
dart: ">=2.12.0-0.0 <3.0.0"
|
||||||
|
flutter: ">=1.22.0"
|
@ -0,0 +1,32 @@
|
|||||||
|
name: flutter_module_using_plugin
|
||||||
|
description: An example Flutter module that uses a plugin.
|
||||||
|
|
||||||
|
version: 1.0.0+1
|
||||||
|
|
||||||
|
environment:
|
||||||
|
sdk: ">=2.6.0-dev <3.0.0"
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
flutter:
|
||||||
|
sdk: flutter
|
||||||
|
provider: ^4.1.0
|
||||||
|
url_launcher: ^5.2.5
|
||||||
|
sensors: ^0.4.2
|
||||||
|
|
||||||
|
dev_dependencies:
|
||||||
|
flutter_test:
|
||||||
|
sdk: flutter
|
||||||
|
|
||||||
|
flutter:
|
||||||
|
uses-material-design: true
|
||||||
|
|
||||||
|
# This section identifies your Flutter project as a module meant for
|
||||||
|
# embedding in a native host app. These identifiers should _not_ ordinarily
|
||||||
|
# be changed after generation - they are used to ensure that the tooling can
|
||||||
|
# maintain consistency when adding or modifying assets and plugins.
|
||||||
|
# They also do not have any bearing on your native host application's
|
||||||
|
# identifiers, which may be completely independent or the same as these.
|
||||||
|
module:
|
||||||
|
androidX: true
|
||||||
|
androidPackage: dev.flutter.example.flutter_module_using_plugin
|
||||||
|
iosBundleIdentifier: dev.flutter.example.flutterModuleUsingPlugin
|
@ -0,0 +1,49 @@
|
|||||||
|
// This is a basic Flutter widget test.
|
||||||
|
//
|
||||||
|
// To perform an interaction with a widget in your test, use the WidgetTester
|
||||||
|
// utility that Flutter provides. For example, you can send tap and scroll
|
||||||
|
// gestures. You can also use WidgetTester to find child widgets in the widget
|
||||||
|
// tree, read text, and verify that the values of widget properties are correct.
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
|
||||||
|
import 'package:flutter_module_using_plugin/main.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
class MockCounterModel extends ChangeNotifier implements CounterModel {
|
||||||
|
int _count = 0;
|
||||||
|
|
||||||
|
int get count => _count;
|
||||||
|
|
||||||
|
void increment() {
|
||||||
|
_count++;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
testWidgets('MiniView smoke test', (WidgetTester tester) async {
|
||||||
|
// Build our app and trigger a frame.
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
home: ChangeNotifierProvider<CounterModel>.value(
|
||||||
|
value: MockCounterModel(),
|
||||||
|
child: Contents(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Verify that our counter starts at 0.
|
||||||
|
expect(find.text('Taps: 0'), findsOneWidget);
|
||||||
|
expect(find.text('Taps: 1'), findsNothing);
|
||||||
|
|
||||||
|
// Tap the '+' icon and trigger a frame.
|
||||||
|
await tester.tap(find.text('Tap me!'));
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
// Verify that our counter has incremented.
|
||||||
|
expect(find.text('Taps: 0'), findsNothing);
|
||||||
|
expect(find.text('Taps: 1'), findsOneWidget);
|
||||||
|
});
|
||||||
|
}
|