Aller au contenu

Guides

React Native & Expo

formkrafter-react-native rend les mêmes specs de formulaire que les packages web avec des composants natifs — pas de WebView, pas de Web Components. La validation, les règles, les sources d’options et le parcours du récapitulatif viennent tous de formkrafter-core : un spec construit dans le builder web se rend sur téléphone sans modification.

C’est un renderer : pas de builder mobile, par choix.

Terminal window
npx expo install @streamline-pulse/formkrafter-react-native

React ≥18 et React Native ≥0.76 sont des peer dependencies. Rien d’autre n’est requis pour les bricks de base — date, fichier et signature vivent chacune derrière un point d’entrée opt-in.

  1. Enveloppez votre app dans le provider de thème :

    import { FkThemeProvider } from '@streamline-pulse/formkrafter-react-native'
    <FkThemeProvider theme={colorScheme === 'dark' ? 'dark' : 'light'}>
    <App />
    </FkThemeProvider>
  2. Rendez un spec :

    import { useRef } from 'react'
    import { FormRenderer } from '@streamline-pulse/formkrafter-react-native'
    import type { FormRendererHandle } from '@streamline-pulse/formkrafter-react-native'
    function Checkout({ spec }) {
    const form = useRef<FormRendererHandle>(null)
    return (
    <FormRenderer
    ref={form}
    spec={spec}
    onDataChange={(data, isValid) => console.log(data, isValid)}
    onSubmit={(data, isValid) => isValid && send(data)}
    />
    )
    }
  3. Validez à la demande via la ref :

    const result = form.current?.validate()
    // { valid: boolean, errors: { cléDuChamp: message, … } }

Un spec wizard (panel:stepper) se rend avec la validation par étape et son propre bouton d’envoi, qui appelle votre onSubmit — aucun câblage supplémentaire. Les lignes de grille comptent dans le verdict global.

FkThemeProvider accepte 'light', 'dark' ou une table de tokens complète — les mêmes valeurs que le web expose en variables CSS :

import { fkDarkTheme } from '@streamline-pulse/formkrafter-react-native'
<FkThemeProvider theme={{ ...fkDarkTheme, colorPrimary: '#e0662d' }}>

Deux leviers indépendants, identiques au web :

  • Les textes du chrome (boutons du stepper, actions de la grille, recherche du select…) viennent du store partagé : setFkTranslations(frFkTranslations) depuis formkrafter-core.
  • Les libellés de champs écrits { en: 'Full name', fr: 'Nom complet' } se résolvent via la prop locale de FormRenderer.

Basculez les deux sans remontage — les données saisies restent.

Metro résout les imports statiquement, donc les bricks qui dépendent d’un module natif vivent sur leurs propres points d’entrée. Installez le module, appelez l’enregistrement une fois au démarrage ; les applications qui se passent d’une brick ne résolvent jamais son module.

Point d’entrée Module natif Enregistrement
…/date @react-native-community/datetimepicker registerNativeDateBricks()
…/file expo-document-picker registerNativeFileBrick()
…/signature react-native-svg registerNativeSignatureBrick()
import { registerNativeDateBricks } from '@streamline-pulse/formkrafter-react-native/date'
registerNativeDateBricks()

Les uploads passent par le fileUploadService de core — le même point d’injection que le web — et la signature stocke un data URL image/svg+xml là où le canvas web produit du PNG.

Le registre est le point d’extension. Une brick reçoit data, error, disabled, les configs résolues et onDataChange, et rend ce qu’elle veut — gluestack, NativeBase, Tamagui ou vos propres composants :

import {
createNativeBrick,
registerNativeBrick,
} from '@streamline-pulse/formkrafter-react-native'
registerNativeBrick(
createNativeBrick({
type: 'input',
id: 'rating',
render: (props) => (
<Stars value={props.data} onChange={props.onDataChange} error={props.error} />
),
}),
)

Enregistrez avant le premier rendu pour remplacer une brick intégrée — les défauts n’écrasent jamais un enregistrement existant. Les bricks sans renderer natif affichent un placeholder explicite au lieu d’échouer.

Un projet de Streamline Pulse