How to Use BuildContext with Async Safely

If you’ve ever received the DON’T use BuildContext across asynchronous gaps. message in Flutter you’re in good company. I keep getting it, fixing it, then forgetting what I did when I get it next time. The solution is very simple, don’t do that in stateless widgets and always check if the widget is mounted. It is made slightly more complicated by the fact that the docs on the linter error are either wrong or out of date. Build Context The Wrong Way Here’s why this is bad. This is a button handler called from the onPress method of some button in [Read on…]

Simple Time Control For Dart Unit Tests

Controlling time in a unit test allows you to test code that depends on the passage of time like Timer or time comparisons. Dart makes it easy as long as you use the Clock package in code that gets dates instead of using DateTime directly. For any code using Clock time can be controlled through the FakeAsync package. Example Time Test Two key things to note in this example test. First that the test is wrapped in the fakeAsync method. Second that the first time clock is used is inside the fakeAsync wrapper. That’s important, if you access the clock [Read on…]

AWS Websocket 403 Using PostToConnect

Using the V2 Golang SDK for AWS and trying to call PostToConnection from a Lambda I was consistently getting this 403 error result: I was trying to make the call from a different stack than the websocket connection was on so I thought that might be the problem. After much research the issue actually turned out to be simpler than that. There is nothing special about the stack that requires extra permission (unless the stages are in different regions, I haven’t done that yet but it looks like there is more work required if you are). The issue for me [Read on…]

Simple Close Button Handling for Flutter Snackbar

Adding a close button to a snackbar in Flutter is simple, however there is one subtlety to be aware of. If the view closes before the snackbar does then you can no longer get the ScaffoldMessenger from context in the close handler. Instead you need to pass the ScaffoldMessenger into the closure so that it remains available after the view closes. Wrong Way This approach will work most of the time, unless the view has already been disposed when the close button is clicked. Since snackbars are often used for errors or other termination handlers it is fairly common for [Read on…]

Success With AWS Web Socket Endpoint Configuration

I had a lot of trouble getting the API Gateway socket management calls to work using the AWS SDK V2 version of the Golang SDK. The problem was that I was not invoking the right endpoint. So that I remember in the future how to do this and to help anyone having similar problems here’s the magic formula I finally learned. Endpoint Value First you need to know the endpoint to use to make calls against. You can either look it up in the AWS console or get it dynamically from the request. I chose to get it from the [Read on…]

Working AWS Websocket JWT Authorizer

I was trying to add JWT authentication to an AWS web socket endpoint and it wasn’t working. My problem was simple and it was even spelled out mentioned in passing somewhere in the AWS docs and it still took me a long time to figure it out. The answer is that only request style authenticators are supported, not token. The docs say that here in that it doesn’t mention a token authorizer and explicitly states that only request is supported here. This post also makes the same point. In Serverless the configuration for the authorizer looks like this: Then a [Read on…]

Connecting Siri to Custom Intents in SwiftUI

Making a custom intent for Siri is pretty simple and there are some good articles on it out there but when I followed them it wasn’t working for me. Specifically asking Siri or invoking a shortcut was returning an error and my Intent handler wasn’t being called. The answer turned out to be really simple once I knew what I was doing. Hopefully this helps someone else. Creating the intent For SwiftUI this article is a good walk through, the Apple documentation is also good. What was missing for me is how Siri knows to invoke your extension in a [Read on…]

Simple HTML Parsing in Swift

I needed to parse some HTML in a SwiftUI project so I could put the content into a Text view. I couldn’t use the HTML partly because of weird behaviour in WKWebView but that’s for another post. This is was a simple case, I didn’t need any structure information from the HTML, just the text with the tags removed. Parsing HTML is always a bit evil so I tend to look for built-in services that can do it for me. Here’s what I found. Using NSAttributedString to load HTML Turns out that NSAttributedString has a way to directly load HTML [Read on…]

Sharing Swift package with WatchOS extension

I was working on a simple iOS app as a small side project and thought it would be fun to have a watch extension for it. Since the bulk of the project involved retrieving and parsing some JSON via a REST call, I wanted to share a package with Swift code between the app and the extension. It turned out to be complicated to figure out how to do that. It’s simple to do in practice so I wanted to document the process for the future. Note: This is not the simplest way to share code. It is the simplest [Read on…]

Missing argument in SwiftUI ForEach

I’ve been experimenting a bit with SwiftUI and ran into an error that it took me an embarrassingly long time to diagnose. The error message is “Missing argument for parameter #1 in call” and it appeared on a ForEach statement in a View. Here’s the cause as well as some troubleshooting steps I wish I’d followed. The SwiftUI Code The change I was trying to make was to the return type of the property stuff.all. I wanted to return a more specialized type to handle some localization conditions. For example, a change like this: As soon as I made the [Read on…]