Skip to content

LiveOrNot/FlutterSharp

Repository files navigation

FlutterSharp

Tutorials

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows;
using FlutterSharp.Annotations;
using FlutterSharp.Services;
using FlutterSharp.Services.Implements;

namespace FlutterSharp.Wpf
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        private IFlutterSharp _flutterSharp;

        public MainWindow()
        {
            InitializeComponent();

            _flutterSharp = new FlutterSharpBuilder()
                .UseConfiguration(new FlutterSharpConfiguration()
                {
                    PluginAssemblies = new List<Assembly>() { Assembly.GetEntryAssembly() },
                    ProjectPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\..\flutter_demo\build\windows\runner\Debug")
                }).Build();

            _flutterSharp.Initialize();

            Host.Children.Add(_flutterSharp.Host);
        }

        [Export(typeof(FlutterPlugin))]
        [PartCreationPolicy(CreationPolicy.Shared)]
        public class TestPlugin : FlutterPlugin
        {
            public override string Name => nameof(TestPlugin);

            protected override string ChannelName => "fluttersharp.plugins/test_plugin";

            [FlutterMethod("callCsharp")]
            public string CallCsharp(string message)
            {
                return $"Flutter 调用 C# 成功: {message}";
            }

            public void CallFlutter(string message)
            {
                CallFlutterMethod(new object[] { message });
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var testPlugin = _flutterSharp.Container.GetExportedValues<FlutterPlugin>().FirstOrDefault(p => p.Name == "TestPlugin");
            (testPlugin as TestPlugin)?.CallFlutter(TbMessage?.Text ?? string.Empty);
        }
    }
}
import 'package:flutter/services.dart';

const MethodChannel _channel = MethodChannel('fluttersharp.plugins/test_plugin');


class TestPlugin {
  Function? _onCallback;

  TestPlugin() {
    _channel.setMethodCallHandler(callbackHandler);
  }

  Future<dynamic> callbackHandler(dynamic arg) {    
    _onCallback!(arg.arguments["message"]);
    return Future.value(null);
  }

  void setCallbackHandler({Function? onCallback}) {
    _onCallback = onCallback;
  }

  Future<String?> callCsharp(String message) async {
    final Map<String, Object> args = <String, Object>{
      'message': message
    };
    return await _channel.invokeMethod<String>("callCsharp", args);
  }

}

Showcase

Flutter 调用 C# C# 回调 Flutter

About

Using C # to implement flutter desktop assembly binding

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published