diff --git a/experimental/add_to_app/android_fullscreen/app/src/main/AndroidManifest.xml b/experimental/add_to_app/android_fullscreen/app/src/main/AndroidManifest.xml index 0f2788005..bd2b7ff9e 100644 --- a/experimental/add_to_app/android_fullscreen/app/src/main/AndroidManifest.xml +++ b/experimental/add_to_app/android_fullscreen/app/src/main/AndroidManifest.xml @@ -3,7 +3,7 @@ package="dev.flutter.example.androidfullscreen"> (R.id.launch_button) + button.setOnClickListener { - startActivity(FlutterActivity.createDefaultIntent(this)) + val intent = FlutterActivity + .withCachedEngine(ENGINE_ID) + .build(this) + startActivity(intent) } } + + override fun onResume() { + super.onResume() + val app = application as MyApplication + counterLabel?.text = "Current count: ${app.count}" + } } diff --git a/experimental/add_to_app/android_fullscreen/app/src/main/java/dev/flutter/example/androidfullscreen/MyApplication.kt b/experimental/add_to_app/android_fullscreen/app/src/main/java/dev/flutter/example/androidfullscreen/MyApplication.kt new file mode 100644 index 000000000..9cf0dd891 --- /dev/null +++ b/experimental/add_to_app/android_fullscreen/app/src/main/java/dev/flutter/example/androidfullscreen/MyApplication.kt @@ -0,0 +1,55 @@ +// 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. + +package dev.flutter.example.androidfullscreen + +import android.app.Application +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.embedding.engine.FlutterEngineCache +import io.flutter.embedding.engine.dart.DartExecutor +import io.flutter.plugin.common.MethodChannel +import io.flutter.view.FlutterMain + +const val ENGINE_ID = "1" + +class MyApplication : Application() { + var count = 0 + + private var channel: MethodChannel? = null + + override fun onCreate() { + super.onCreate() + + FlutterMain.startInitialization(this) + FlutterMain.ensureInitializationComplete(this, null) + + val flutterEngine = FlutterEngine(this) + flutterEngine + .dartExecutor + .executeDartEntrypoint( + DartExecutor.DartEntrypoint.createDefault() + ) + + FlutterEngineCache.getInstance().put(ENGINE_ID, flutterEngine) + + channel = MethodChannel(flutterEngine.dartExecutor, "dev.flutter.example/counter") + + channel?.setMethodCallHandler { call, _ -> + when (call.method) { + "incrementCounter" -> { + count++ + reportCounter() + } + "requestCounter" -> { + print("requestCounter") + reportCounter() + } + } + } + } + + private fun reportCounter() { + channel?.invokeMethod("reportCounter", count) + } +} diff --git a/experimental/add_to_app/android_fullscreen/app/src/main/res/layout/activity_main.xml b/experimental/add_to_app/android_fullscreen/app/src/main/res/layout/activity_main.xml index 4d1c91af6..e02fab7aa 100644 --- a/experimental/add_to_app/android_fullscreen/app/src/main/res/layout/activity_main.xml +++ b/experimental/add_to_app/android_fullscreen/app/src/main/res/layout/activity_main.xml @@ -14,6 +14,18 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + tools:ignore="HardcodedText" /> + + \ No newline at end of file diff --git a/experimental/add_to_app/flutter_module/lib/main.dart b/experimental/add_to_app/flutter_module/lib/main.dart index faca10fda..354371cc1 100644 --- a/experimental/add_to_app/flutter_module/lib/main.dart +++ b/experimental/add_to_app/flutter_module/lib/main.dart @@ -4,8 +4,44 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:provider/provider.dart'; -void main() => runApp(MyApp()); +void main() { + WidgetsFlutterBinding.ensureInitialized(); + + final model = CounterModel(); + + runApp( + ChangeNotifierProvider.value( + value: model, + child: MyApp(), + ), + ); +} + +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 _handleMessage(MethodCall call) async { + if (call.method == 'reportCounter') { + _count = call.arguments as int; + notifyListeners(); + } + } +} class MyApp extends StatelessWidget { @override @@ -32,18 +68,11 @@ class FullScreenView extends StatelessWidget { } } -class Contents extends StatefulWidget { +class Contents extends StatelessWidget { final bool showExit; const Contents({this.showExit = false}); - @override - _ContentsState createState() => _ContentsState(); -} - -class _ContentsState extends State { - int count = 0; - @override Widget build(BuildContext context) { final mediaInfo = MediaQuery.of(context); @@ -73,20 +102,28 @@ class _ContentsState extends State { children: [ Text( 'Window is ${mediaInfo.size.width.toStringAsFixed(1)} x ' - '${mediaInfo.size.height.toStringAsFixed(1)}', + '${mediaInfo.size.height.toStringAsFixed(1)}', style: Theme.of(context).textTheme.headline, ), SizedBox(height: 16), - Text( - 'Taps: $count', - style: Theme.of(context).textTheme.headline, + Consumer( + builder: (context, model, child) { + return Text( + 'Taps: ${model.count}', + style: Theme.of(context).textTheme.headline, + ); + }, ), SizedBox(height: 16), - RaisedButton( - onPressed: () => setState(() => count++), - child: Text('Tap me!'), + Consumer( + builder: (context, model, child) { + return RaisedButton( + onPressed: () => model.increment(), + child: Text('Tap me!'), + ); + }, ), - if (widget.showExit) ...[ + if (showExit) ...[ SizedBox(height: 16), RaisedButton( onPressed: () => SystemNavigator.pop(), diff --git a/experimental/add_to_app/flutter_module/pubspec.lock b/experimental/add_to_app/flutter_module/pubspec.lock index 4df5619f3..5a2a7b187 100644 --- a/experimental/add_to_app/flutter_module/pubspec.lock +++ b/experimental/add_to_app/flutter_module/pubspec.lock @@ -109,6 +109,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.4.0" + provider: + dependency: "direct main" + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" quiver: dependency: transitive description: diff --git a/experimental/add_to_app/flutter_module/pubspec.yaml b/experimental/add_to_app/flutter_module/pubspec.yaml index ab6e75ff1..4ae72de98 100644 --- a/experimental/add_to_app/flutter_module/pubspec.yaml +++ b/experimental/add_to_app/flutter_module/pubspec.yaml @@ -9,6 +9,7 @@ environment: dependencies: flutter: sdk: flutter + provider: ^3.1.0 dev_dependencies: flutter_test: diff --git a/experimental/add_to_app/ios_fullscreen/IOSFullScreen/Base.lproj/Main.storyboard b/experimental/add_to_app/ios_fullscreen/IOSFullScreen/Base.lproj/Main.storyboard index 2f5ae7350..b8dcc7d36 100644 --- a/experimental/add_to_app/ios_fullscreen/IOSFullScreen/Base.lproj/Main.storyboard +++ b/experimental/add_to_app/ios_fullscreen/IOSFullScreen/Base.lproj/Main.storyboard @@ -18,21 +18,32 @@ - + + + + + + diff --git a/experimental/add_to_app/ios_fullscreen/IOSFullScreen/ViewController.swift b/experimental/add_to_app/ios_fullscreen/IOSFullScreen/ViewController.swift index 76976b3aa..9b2cf6819 100644 --- a/experimental/add_to_app/ios_fullscreen/IOSFullScreen/ViewController.swift +++ b/experimental/add_to_app/ios_fullscreen/IOSFullScreen/ViewController.swift @@ -6,10 +6,43 @@ import UIKit import Flutter class ViewController: UIViewController { + + @IBOutlet weak var counterLabel: UILabel! + + var methodChannel : FlutterMethodChannel? + var count = 0 + + override func viewDidLoad() { + if let flutterEngine = (UIApplication.shared.delegate as? AppDelegate)?.flutterEngine { + methodChannel = FlutterMethodChannel(name: "dev.flutter.example/counter", + binaryMessenger: flutterEngine.binaryMessenger) + methodChannel?.setMethodCallHandler({ [weak self] + (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in + if let strongSelf = self { + switch(call.method) { + case "incrementCounter": + strongSelf.count += 1 + strongSelf.counterLabel.text = "Current counter: \(strongSelf.count)" + strongSelf.reportCounter() + case "requestCounter": + strongSelf.reportCounter() + default: + // Unrecognized method name + print("Unrecognized method name: \(call.method)") + } + } + }) + } + } + + func reportCounter() { + methodChannel?.invokeMethod("reportCounter", arguments: count) + } + @IBAction func buttonWasTapped(_ sender: Any) { - let flutterEngine = (UIApplication.shared.delegate as? AppDelegate)?.flutterEngine - let flutterViewController = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil)! - self.present(flutterViewController, animated: false, completion: nil) + if let flutterEngine = (UIApplication.shared.delegate as? AppDelegate)?.flutterEngine { + let flutterViewController = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil) + self.present(flutterViewController, animated: false, completion: nil) + } } } - diff --git a/experimental/add_to_app/ios_fullscreen/Podfile.lock b/experimental/add_to_app/ios_fullscreen/Podfile.lock index 3546304a9..b22d00b20 100644 --- a/experimental/add_to_app/ios_fullscreen/Podfile.lock +++ b/experimental/add_to_app/ios_fullscreen/Podfile.lock @@ -23,6 +23,6 @@ SPEC CHECKSUMS: flutter_module: 37f078337caf8acad3074374a49bf81442fd3e07 FlutterPluginRegistrant: d59dd07dd90e9c6430996073575a5bd1ea19677e -PODFILE CHECKSUM: 3a2cacb59163f4a25654a84fcd92b179f682c008 +PODFILE CHECKSUM: 1f9809794b37c933b7cb40791d64724dc2376c54 COCOAPODS: 1.7.5