-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[flutter_local_notifications_windows] Windows FFI plugin #2366
base: master
Are you sure you want to change the base?
Conversation
Sorry to hear, hope that's going well 🙂
That's annoying, I checked the changelog and found mention of
I didn't mock everything out, as I was interested in maintaining tests that the XML does in fact conform to the Windows API. So the unit tests actually do send full XML to the Windows API and try to send notifications. If this doesn't work on the server, I'd still like to keep them, but maybe we'll just run them manually when changing XML code and configure the CI to only run "safe" tests. Speaking of, I added a global
Hit an annoying issue where "skip these tests on Windows" was actually causing Linux tests to fail. Filed dart-lang/test#2277 to propose to change that, but in the meantime I exclude
Done and pushed On another note, I had previously tried to make the Dart package completely separate from Flutter so it can be used in CLI apps. I still believe there is value to that, but when running Package validation found the following error:
* pubspec.yaml allows Flutter SDK version 1.9.x, which does not support the flutter.plugin.platforms key.
Please consider increasing the Flutter SDK requirement to ^1.10.0 (environment.sdk.flutter)
See https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin Basically, even though having a My recommendation is to run |
I'll take a look and come back to you on these but thought I'd reply in case you missed it since it wasn't brought up in your last message and mention that builds are failing due to the meta version specified |
Good eye -- fixed |
Thanks minor surgery and still bit of discomfort but all good besides that :)
I forgot to ask but is this realistically possible? In the case of the platform interface, this would normally be a transitive dependency. In the case of the Windows plugin, I don't know if you could build a CLI app that shows notifications on the Windows platform? Presumably what you mean is the equivalent of using Visual Studio to create a console app and referencing the Windows APIs to display notifications
This is what I get besides the Flutter one
I've taken a look at the issue you linked and conscious it's been open for a while. I do have a number of thoughts relating to this to and may be missing some additional context and other information so do let me know if I'm missing anything. If issue linked addressed and there are valid cases for CLI apps, I wonder if it'd be better for the "greater good" to go ahead with the Flutter requirement and revisit this. Those who use this plugin would be those looking to build a multiplatform apps. Other aspect of this is if the issue you raised is addressed, then this presumably requires newer version of the Dart SDK. If so, this would cause the Flutter SDK requirement to go even higher and limit the reach even further. If it's possible to build a Dart CLI app that can show notifications on Windows then this sounds like it one target a very small audience if such an audience even exists. I'm basing this on the assumption that this implies that this is a developer who works on the Windows platform and rather than building a Windows console application, has decided to use Dart. Is this what it would mean? If so, this seems like an odd choice to me. In my experience, companies that build dedicated solutions targeting Windows would employ devs and leverage based on .NET On a different note, it looks like Windows example is failing to built I'm not sure what's the cause there. However, I'm noticing that the integration tests are failing to run for Android. It seems as though the deprecation warning is being treated as a error but can't reproduce this locally even if I run the integration tests via melos. Given I had raised a PR recently to update one of the workflows and didn't have this issue, I wonder if something got changed that impacted this? |
It's been a while since I've worked on Windows apps so didn't get to spend much time on it but ran into the following problems relating my previous post
Based on the above it looks like trying to support CLI apps isn't actually possible, at least not in the current state either |
@Levi-Lesches thank you for your work on this! I highly appreciate Windows support :) |
@Levi-Lesches no rush and could be that you've been busy. Wanted to ping in case you missed some comments/questions I left. Looks like @autoantwort left a comment on the PR as well Edit: I also wanted to nudge as I'll be going on holidays in a few weeks time |
@MaikuB Thanks for the ping, I was kinda going through it with some personal matters.
Should be ready to merge now! Note that it depends on |
Okay, @MaikuB I fixed the issue and merged, try now EDIT: This message got messed up due to DST, I actually sent it later in the thread 🤷♂️ |
Thanks @Levi-Lesches. I'll be trying to get the current prerelease out first and then come back to this one. In the interest of time. I may push directly to this fork if there are merge conflicts to resolve afterwards due to this |
@Levi-Lesches looks like the Windows build tasks failed. You able to see what the issue is? |
The error is definitely new to me and doesn't occur when I run on my machine. From Googling around, the error EDIT 1 Seems this is the first time the CI is running since we added Windows builds to it, so this could be the issue EDIT 2 @MaikuB Since every workflow run requires your approval, can you add some steps between checkout and build in the windows build jobs to rename the directories to something much shorter? That should fix the issue |
@Levi-Lesches the approval is need for first-time contributors and in your case, it's due to the PR not having being landed. I won't get to make these changes for a while as I've only time to try to land #2442. If you have time, you may be able to test your proposal by temporarily changing the workflow (e.g. run on push) and see how it fixes the issue. A shame to see the file/path length limit is still a PITA for Windows :( Edit: looks like this is related to actions/runner#1676. With the issue still being open, I'm not sure if there are solutions available |
While it's true that the base path is @MaikuB GitHub isn't handling daylight savings properly on my end, so my comments now are actually being sent upwards in the chat! Anyway, I fixed the issue now, see this which has the fix vs this which does not. Try running it again now. I also fixed the merge conflict |
@MaikuB So close! Not sure if you missed the CI turning green or want to wait for next week on this, so I'll just drop a reminder. Also not sure if you noticed the chat going wonky during the shift to DST too or if that was just on my end, so I figured I'd leave a message that can actually be at the bottom of the thread this time |
When I checked after your message, it was still red but the results may have been cached. I still need to retest before merging just in case. Regarding the timing issue on GitHub, yeah I noticed it but thought it was just me as I've seen a similar issue on Slack that was to do with Chromium browsers but sounds like it was a general problem |
Thanks, lmk if you need anything else. On the bright side... I guess we know now that the scheduling features on Windows don't throw crazy errors during DST transitions! |
Update: I went in and simplified the code since yesterday, it's now in a reviewable state. If it would help, I can rebase + commit the first 50 or so commits and start with a cleaner slate.
This is a spin off of #2349, which implements the same logic but with an FFI plugin instead of method channels. I'm happy with it so far, here's the gist:
The C/C++ code
src/ffi_api.h
: a C API between C++ and Dartsrc/plugin.hpp
: A C++ class that holds Windows-specific API handlessrc/ffi_api.cpp
: C++ code to implement the C API using the C++ classThe Dart code
flutter_local_notifications_windows
that implements the same functionality as before.lib/src/details
holds all the platform-specific detailslib/src/ffi
holds basic FFI stuff, like generated bindings and utilslib/src/plugin
holds the Windows plugin interface, the real FFI implementation, and a stub, becausedart:ffi
will break web apps (note, the API does referencedart:io
but it still compiles on web)Notes
HandleMethodCall
function that had to handle every possibility. I'm glad that's gone. Now we have a similar mechanism with Dart <--> C <--> C++ andpackage:ffigen
sets everything up for us."hello".toNativeString()
, but other types require allocating memory manually.Benefits
flutter_local_notifications_windows
instead of hijacking the original package and half-sharing some of the original implementations. That means no more platform checks, all the logic can be safely dealt with in a Windows-only context.Summary of changes
That's only ~2,200 additions. the other half GitHub is reporting is automatically generated, like the example's new
windows
folder.Important
FFI is a more recent development than method channels. As such, some more advanced FFI features are locked behind some more recent Dart versions. I already had to downgrade
package:ffigen
from a beta 13.0 to a whopping 7.0, but more pressing is that for C to call a Dart function from another thread (eg, when a notification is pressed), you need to use features from Dart 3.1. The current constraint is only 2.17.Including this new implementation will force Dart ^3.1.0 on end-users. At this point, 2.17 is two years old, 3.1 is about one year old, and null safety is almost 3.5 years old. Age aside, I also don't believe going from 2.17 to 3.1 is so burdensome, especially since 2.17 is already after null-safety, and the Dart team's official position is that 3.0 is not really a breaking change in practice. In other words, I'm not sure I see a situation where someone is really stuck. They can either upgrade any pre-null-safety code, not upgrade this package further, or fork this package to add null Windows or future updates as needed.
Overall, I'd recommend bumping the SDK version of the front-facing package to 3.1.0 as well to better advertise this, and to benefit from any features, since 2.17 and beyond -- better null promotion, FFI for mobile platforms, class modifiers, macros, and more.