diff --git a/v2/internal/binding/reflect.go b/v2/internal/binding/reflect.go index 3b79428f0..29dbe9440 100755 --- a/v2/internal/binding/reflect.go +++ b/v2/internal/binding/reflect.go @@ -78,10 +78,16 @@ func (b *Bindings) getMethods(value interface{}) ([]*BoundMethod, error) { input := methodType.In(inputIndex) thisParam := newParameter("", input) + thisInput := input + + if thisInput.Kind() == reflect.Slice { + thisInput = thisInput.Elem() + } + // Process struct pointer params - if input.Kind() == reflect.Ptr { - if input.Elem().Kind() == reflect.Struct { - typ := input.Elem() + if thisInput.Kind() == reflect.Ptr { + if thisInput.Elem().Kind() == reflect.Struct { + typ := thisInput.Elem() a := reflect.New(typ) s := reflect.Indirect(a).Interface() b.converter.Add(s) @@ -89,8 +95,8 @@ func (b *Bindings) getMethods(value interface{}) ([]*BoundMethod, error) { } // Process struct params - if input.Kind() == reflect.Struct { - a := reflect.New(input) + if thisInput.Kind() == reflect.Struct { + a := reflect.New(thisInput) s := reflect.Indirect(a).Interface() b.converter.Add(s) } @@ -108,6 +114,30 @@ func (b *Bindings) getMethods(value interface{}) ([]*BoundMethod, error) { for outputIndex := 0; outputIndex < outputParamCount; outputIndex++ { output := methodType.Out(outputIndex) thisParam := newParameter("", output) + + thisOutput := output + + if thisOutput.Kind() == reflect.Slice { + thisOutput = thisOutput.Elem() + } + + // Process struct pointer params + if thisOutput.Kind() == reflect.Ptr { + if thisOutput.Elem().Kind() == reflect.Struct { + typ := thisOutput.Elem() + a := reflect.New(typ) + s := reflect.Indirect(a).Interface() + b.converter.Add(s) + } + } + + // Process struct params + if thisOutput.Kind() == reflect.Struct { + a := reflect.New(thisOutput) + s := reflect.Indirect(a).Interface() + b.converter.Add(s) + } + outputs = append(outputs, thisParam) } boundMethod.Outputs = outputs diff --git a/website/docs/reference/runtime/intro.mdx b/website/docs/reference/runtime/intro.mdx index 421d7ef90..4c0a6bfe4 100644 --- a/website/docs/reference/runtime/intro.mdx +++ b/website/docs/reference/runtime/intro.mdx @@ -8,9 +8,19 @@ The runtime is a library that provides utility methods for your application. The and the aim is to try and keep them at parity where possible. The Go Runtime is available through importing `github.com/wailsapp/wails/v2/pkg/runtime`. All methods in this package -take a context as the first parameter. This context can be obtained from the [OnStartup](/docs/reference/options#OnStartup) -or [OnDomReady](/docs/reference/options#OnDomReady) hooks. +take a context as the first parameter. This context can be obtained from the [OnStartup](/docs/reference/options#onstartup) +or [OnDomReady](/docs/reference/options#ondomready) hooks. + +:::info Note + +Whilst the context will be provided to the +[OnStartup](/docs/reference/options#onstartup) method, there's no guarantee the runtime will work in this method as +the window is initialising in a different thread. If +you wish to call runtime methods at startup, use [OnDomReady](/docs/reference/options#ondomready). + +::: The Javascript library is available to the frontend via the `window.runtime` map. There is a runtime package generated when using `dev` mode that provides Typescript declarations for the runtime. This should be located in the `wailsjs` directory in your frontend directory. +