first commit

This commit is contained in:
Nick Fisher
2021-09-15 20:07:11 +08:00
commit a0f877be48
292 changed files with 100157 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
import 'package:flutter/services.dart';
abstract class FilamentController {
void onFilamentViewCreated(int id);
Future initialize();
Future loadSkybox(String skyboxPath, String lightingPath);
Future loadGlb(String path);
}
class MimeticFilamentController extends FilamentController {
late int _id;
late MethodChannel _channel;
@override
void onFilamentViewCreated(int id) async {
_id = id;
_channel = MethodChannel("mimetic.app/filament_view_$id");
}
@override
Future initialize() async {
await _channel.invokeMethod("initialize");
}
@override
Future loadSkybox(String path) {
throw Exception();
}
Future loadGlb(String path) {
throw Exception();
}
}

13
lib/mimetic_filament.dart Normal file
View File

@@ -0,0 +1,13 @@
import 'dart:async';
import 'package:flutter/services.dart';
class MimeticFilament {
static const MethodChannel _channel = MethodChannel('mimetic_filament');
static Future<String?> get platformVersion async {
final String? version = await _channel.invokeMethod('getPlatformVersion');
return version;
}
}

View File

@@ -0,0 +1,19 @@
// You have generated a new plugin project without
// specifying the `--platforms` flag. A plugin project supports no platforms is generated.
// To add platforms, run `flutter create -t plugin --platforms <platforms> .` under the same
// directory. You can also find a detailed instruction on how to add platforms in the `pubspec.yaml` at https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin-platforms.
import 'dart:async';
import 'package:flutter/services.dart';
class MimeticFilamentPlugin {
static const MethodChannel _channel = MethodChannel('mimetic_filament');
static Future<String?> get platformVersion async {
final String? version = await _channel.invokeMethod('getPlatformVersion');
return version;
}
static void initialize() {}
}

View File

@@ -0,0 +1,58 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import '../../filament_controller.dart';
import 'filament_view_platform.dart';
class FilamentView extends FilamentViewPlatform {
static const FILAMENT_VIEW_ID = 'mimetic.app/filament_view';
@override
Widget buildView(
int creationId,
FilamentViewCreatedCallback onFilamentViewCreated,
) {
switch (defaultTargetPlatform) {
case TargetPlatform.android:
return PlatformViewLink(
viewType: FILAMENT_VIEW_ID,
surfaceFactory:
(BuildContext context, PlatformViewController controller) {
return AndroidViewSurface(
controller: controller as AndroidViewController,
gestureRecognizers: const <
Factory<OneSequenceGestureRecognizer>>{},
hitTestBehavior: PlatformViewHitTestBehavior.opaque,
);
},
onCreatePlatformView: (PlatformViewCreationParams params) {
return PlatformViewsService.initSurfaceAndroidView(
id: params.id,
viewType: FILAMENT_VIEW_ID,
layoutDirection: TextDirection.ltr,
creationParams: {},
creationParamsCodec: StandardMessageCodec(),
)
..addOnPlatformViewCreatedListener((int id) {
onFilamentViewCreated(id);
params.onPlatformViewCreated(id);
})
..create();
},
);
case TargetPlatform.iOS:
return UiKitView(
viewType: FILAMENT_VIEW_ID,
onPlatformViewCreated: (int id) {
onFilamentViewCreated(id);
},
);
default:
return Text(
'$defaultTargetPlatform is not yet implemented by Filament plugin.');
}
}
}

View File

@@ -0,0 +1,22 @@
import 'package:flutter/widgets.dart';
import 'package:mimetic_filament/view/filament_view.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
import '../../filament_controller.dart';
typedef void FilamentViewCreatedCallback(int id);
abstract class FilamentViewPlatform extends PlatformInterface {
FilamentViewPlatform() : super(token: _token);
static final Object _token = Object();
static FilamentViewPlatform _instance = FilamentView();
static FilamentViewPlatform get instance => _instance;
Widget buildView(
int creationId,
FilamentViewCreatedCallback onFilamentViewCreated,
) {
throw UnimplementedError('buildView() has not been implemented.');
}
}

View File

@@ -0,0 +1,25 @@
import 'package:flutter/widgets.dart';
import '../filament_controller.dart';
import 'filament_view_platform.dart';
int _nextFilamentCreationId = 0;
class FilamentWidget extends StatefulWidget {
final FilamentController controller;
const FilamentWidget({Key? key, required this.controller}) : super(key: key);
@override
_FilamentWidgetState createState() => _FilamentWidgetState();
}
class _FilamentWidgetState extends State<FilamentWidget> {
final _viewId = _nextFilamentCreationId++;
@override
Widget build(BuildContext context) {
return FilamentViewPlatform.instance
.buildView(_viewId, widget.controller.onFilamentViewCreated);
}
}