Skip to content

Latest commit

 

History

History

README.md

GoFlow Widgets Documentation

Complete reference for all GoFlow widgets with examples and best practices.

Widget Categories

Layout Widgets

Form Widgets

  • TextField - Material and Cupertino text input
  • Checkbox - Material checkbox
  • Radio - Material radio button
  • Switch - Material and Cupertino toggle switch
  • Slider - Material and Cupertino value slider

Button Widgets

Display Widgets

  • Text - Display text
  • Icon - Display icons
  • Image - Display images

Scrolling Widgets

Interaction Widgets

App Structure

Material-Specific Widgets

Cupertino-Specific Widgets

Quick Reference

Creating Widgets

import (
    "github.com/base-go/GoFlow/widgets"
    "github.com/base-go/GoFlow/material"
    "github.com/base-go/GoFlow/cupertino"
    "github.com/base-go/GoFlow/adaptive"
)

// Layout
column := &widgets.Column{Children: []goflow.Widget{...}}
row := &widgets.Row{Children: []goflow.Widget{...}}
container := &widgets.Container{Child: child, Padding: padding}

// Material
button := material.NewButton(child, onPressed)
card := material.NewCard(child)

// Cupertino
button := cupertino.NewButton(child, onPressed)
card := cupertino.NewCard(child)

// Adaptive (recommended for cross-platform)
button := adaptive.NewButton("Text", onPressed)
card := adaptive.NewCard(child)

Common Patterns

Center a widget:

&widgets.Center{
    Child: myWidget,
}

Add padding:

&widgets.Container{
    Padding: goflow.NewEdgeInsets(16, 16, 16, 16),
    Child: myWidget,
}

Create a list:

&widgets.ListView{
    Children: []goflow.Widget{
        item1,
        item2,
        item3,
    },
}

Responsive layout:

&widgets.Row{
    Children: []goflow.Widget{
        &widgets.Expanded{Child: widget1},
        &widgets.Expanded{Child: widget2},
    },
}

Widget Lifecycle

All widgets in GoFlow follow this lifecycle:

  1. Construction - Widget is created with New...() or struct literal
  2. Build - Build(context) is called to create the widget tree
  3. Mount - Element is created and mounted to parent
  4. Update - When properties change, widget is rebuilt
  5. Unmount - Widget is removed from tree

Best Practices

1. Use Adaptive Widgets for Cross-Platform Apps

// ✅ Good - works on all platforms
adaptive.NewButton("Click Me", onPressed)

// ❌ Less ideal - platform-specific
material.NewButton(child, onPressed)

2. Prefer Stateless Widgets with Signals

// ✅ Good - reactive with signals
counter := signals.New(0)
&widgets.Text{
    Data: fmt.Sprintf("Count: %d", counter.Get()),
}

// ❌ Less ideal - requires manual updates

3. Use const for Repeated Values

const (
    padding = 16.0
    spacing = 8.0
)

&widgets.Container{
    Padding: goflow.NewEdgeInsets(padding, padding, padding, padding),
    Child: child,
}

4. Extract Complex Widgets into Functions

func buildHeader(title string) goflow.Widget {
    return &widgets.Container{
        Padding: goflow.NewEdgeInsets(16, 8, 16, 8),
        Child: &widgets.Text{Data: title},
    }
}

5. Use ListView.builder for Large Lists

// ✅ Good - efficient for large lists
&widgets.ListViewBuilder{
    ItemCount: 1000,
    ItemBuilder: func(ctx goflow.BuildContext, i int) goflow.Widget {
        return &widgets.Text{Data: fmt.Sprintf("Item %d", i)}
    },
}

// ❌ Avoid - creates all items upfront
&widgets.ListView{
    Children: make1000Items(),
}

Widget Composition

GoFlow widgets are highly composable. Build complex UIs by combining simple widgets:

func buildProfileCard(name, email string) goflow.Widget {
    return material.NewCard(&widgets.Column{
        Children: []goflow.Widget{
            &widgets.Row{
                Children: []goflow.Widget{
                    widgets.NewIcon(widgets.IconPerson),
                    &widgets.Expanded{
                        Child: &widgets.Text{Data: name},
                    },
                },
            },
            &widgets.Text{Data: email},
        },
    })
}

Platform-Specific Behavior

Some widgets behave differently on different platforms:

Widget Android/Linux/Web iOS/macOS
Button Material Design Cupertino
TextField Underline Rounded rectangle
Switch Material toggle iOS toggle
AppBar Material AppBar NavigationBar

Use adaptive package to handle these differences automatically.

Next Steps