Zum Hauptinhalt springen

25. August 2026

Native Base Picker: Setup, Styling & Android Fix

Inhaltsmarketer

Native Base Picker: Setup, Styling & Android Fix onValueChange Sie haben wahrscheinlich denselben Wall wie viele React Native-Teams mit dem NativeBase Picker getroffen. Der Dropdown wird angezeigt, er sieht gut aus, iOS verhält sich, und dann ignoriert Android Ihre Logik. Kein Crash. Keine Warnung. Nur ein Picker, der funktioniert erscheint, während Ihre Geschäftslogik nie ausgeführt wird.

Dahinter liegt der Grund, warum der NativeBase Picker noch immer erfahrene Entwickler überrascht. Die Einrichtung ist einfach, die Gestaltung ist handhabbar, aber die Produktionszuverlässigkeit hängt von der Verständnis eines Android-spezifischen Fehlers ab, den die meisten Anleitungen entweder übergehen oder nie erwähnen.

Inhaltsübersicht

Erste Schritte mit dem NativeBase Picker

Ein Picker ist normalerweise einer dieser Komponenten, die Sie spät in einem Sprint hinzufügen. Landesauswahl, Statusfeld, Terminart, Versandoption. Es fühlt sich klein an, bis Plattformverhalten in Ihre UI sickert.

Die gute Nachricht ist, dass der NativeBase Picker ist leicht auf dem Bildschirm zu finden. Es wurde entwickelt, um einen nativen Picker auf iOS und Android zu rendern und den veralteten React Native Picker in älteren NativeBase-Setups zu ersetzen, weshalb viele legacy-Codebases darauf noch immer angewiesen sind.

Ein Entwickler-Arbeitsplatz mit einem Laptop, das React Native code neben einer mobilen App-Oberfläche zeigt.

Installieren Sie das Komponent in einem normalen React Native Setup

Wenn Ihr Projekt bereits NativeBase verwendet, besteht die Hauptaufgabe darin, die richtigen Grundlagen zu importieren und unnötige Wrapper-Logik am ersten Tag zu vermeiden. Beginnen Sie mit dem einfachsten sichtbaren Picker möglich.

Wenn Sie über mobile und hybride Stapel arbeiten, hilft es auch, zu verstehen, wie React code in breiteren Umgebungen wie React mobile App-Workflows mit Capacitor . Der Picker code bleibt vertraut, aber die Bereitstellungserwartungen ändern sich.

Ein grundlegender Beispiel sieht so aus:

import React, { useState } from 'react';
import { Container, Content, Form, Item, Picker, Icon } from 'native-base';

export default function BasicPickerScreen() {
  const [selectedValue, setSelectedValue] = useState('key0');

  return (
    <Container>
      <Content padder>
        <Form>
          <Item picker>
            <Picker
              mode="dropdown"
              iosIcon={<Icon name="arrow-down" />}
              selectedValue={selectedValue}
              onValueChange={(value) => setSelectedValue(value)}
            >
              <Picker.Item label="Choose one" value="key0" />
              <Picker.Item label="JavaScript" value="js" />
              <Picker.Item label="TypeScript" value="ts" />
              <Picker.Item label="React Native" value="rn" />
            </Picker>
          </Item>
        </Form>
      </Content>
    </Container>
  );
}

Rendern Sie einen ersten Picker ohne zusätzliche Abstraktion

Diese erste Version sollte nur zwei Fragen beantworten:

  • Renderiert es richtig: Sie möchten die Felder überprüfen, ob sie sich innerhalb Ihres Layouts befinden, die Abstände respektieren und auf beiden Plattformen öffnen.
  • Ist Ihr Importpfad korrekt: NativeBase-Projekte scheitern oft an banalen Gründen wie der Mischung alter und neuer Komponenten-APIs.
  • Ist der ausgewählte Wert kontrolliert: Even in a throwaway prototype, use selectedValue aus dem Zustand. Ein unkontrollierter Picker code wird später schwerer zu debuggen.

Praktische Regel: Fangen Sie nicht damit an, Serverdaten, Platzhalterregeln, Analytics-Hooks und Validierungen in denselben Picker zu integrieren. Machen Sie das Komponenten-Modell zunächst sichtbar und kontrolliert.

Das grundlegende Baseline ist wichtig. Wenn Android später Probleme zeigt, wissen Sie, dass es nicht Ihr gesamtes Form-Modell ist, sondern der Picker.

Zuordnung von Zustand und Behandlung von Auswahlmöglichkeiten

Einmal der Picker renderet, ist das nächste Ziel, ihn nützlich zu machen. In React Native bedeutet das, ihn wie einen kontrollierten Eingabefeld zu behandeln und den ausgewählten Wert im Komponenten-Zustand zu speichern.

Der Standardweg ist direkt. Sie speichern den aktuellen Wert mit useState, passen Sie ihn in selectedValueund aktualisieren Sie den Zustand darin onValueChangeDies ist dasselbe Denkmodell, das Sie für andere Formfelder wie z.B. React Native TextInput-Musterbenutzen würden, auch wenn die Benutzeroberfläche anders ist

Verwenden Sie einen kontrollierten Wert von Anfang an

Das ist die saubere Version, die ich bevorzugte, bevor ich Validierung oder Nebeneffekte hinzufügte

import React, { useState } from 'react';
import { Text } from 'react-native';
import { Form, Item, Picker } from 'native-base';

export default function RolePicker() {
  const [role, setRole] = useState('');

  return (
    <>
      <Form>
        <Item picker>
          <Picker
            mode="dropdown"
            selectedValue={role}
            onValueChange={(value) => setRole(value)}
          >
            <Picker.Item label="Select a role" value="" />
            <Picker.Item label="Admin" value="admin" />
            <Picker.Item label="Editor" value="editor" />
            <Picker.Item label="Viewer" value="viewer" />
          </Picker>
        </Item>
      </Form>

      <Text>Selected role: {role || 'none'}</Text>
    </>
  );
}

Das code gibt Ihnen einen vorhersehbaren Quellcode. Die Benutzeroberfläche spiegelt sich roleund jede downstream-Funktion liest aus demselben Zustand

Halten Sie die Auswahllogik klein und testbar

Probleme beginnen normalerweise, wenn Entwickler den Zustand überladen onValueChangeSie laden Daten, ändern mehrere Zustandsstücke, lösen Navigation aus und loggen Analytics in einer einzigen inline-Funktion. Wenn das Picker-Verhalten fehlschlägt, wird das Debuggen schmerzhaft

Ein besseres Muster ist es, den Wertspeicher von Nebeneffekten zu trennen

import React, { useEffect, useState } from 'react';
import { Text } from 'react-native';
import { Form, Item, Picker } from 'native-base';

export default function DepartmentPicker() {
  const [department, setDepartment] = useState('');
  const [message, setMessage] = useState('No department selected');

  useEffect(() => {
    if (!department) {
      setMessage('No department selected');
      return;
    }

    setMessage(`Department selected: ${department}`);
  }, [department]);

  return (
    <>
      <Form>
        <Item picker>
          <Picker
            selectedValue={department}
            onValueChange={setDepartment}
          >
            <Picker.Item label="Select department" value="" />
            <Picker.Item label="Sales" value="sales" />
            <Picker.Item label="Support" value="support" />
            <Picker.Item label="Operations" value="operations" />
          </Picker>
        </Item>
      </Form>

      <Text>{message}</Text>
    </>
  );
}

Diese Struktur erledigt zwei nützliche Dinge:

  1. Sie macht den Picker nur für die Aktualisierung des Auswahlzustands verantwortlich.
  2. Es verschiebt das App-Verhalten in useEffectwo Sie es unabhängig testen und darüber nachdenken können.

Wenn ein Formkomponente nicht zuverlässig Ihren App sagen kann, welches ausgewählte Wert ist, werden alle damit verbundenen Effekte verdächtig.

Dieser Punkt wird auf Android kritisch, wo der von NativeBase Picker vorgesehene Ereignisfluss nicht immer gilt.

Troubleshooting des Android onValueChange Bugs

Dies ist der Teil, den die meisten Artikel überspringen. Der NativeBase Picker kann auf Android gesund aussehen, während er genau in dem Moment versagt, in dem er arbeiten soll.

Die Community-Dokumentation rund um die ältere Picker-Implementierung beschreibt einen echten Plattform-Split. Android löst keine benutzerdefinierten Funktionen aus, die an onValueChangewährend iOS dies tutund diese Fehlfunktion wird als 100% Funktionsunterschied auf Android mit einer 0% Erfolgsrate für die Auslösung von Funktionen auf Android-Geräten trotz identischer code Implementierung in den dokumentierten Berichten. Die gleiche Dokumentation weist Entwickler auf Workarounds oder Migration hin und weist darauf hin, dass das NativeBase 3.0-Komponent Select Komponente erreicht 98% Erfolg bei der Auslösung von Funktionen auf beiden Plattformen in getesteten Umgebungen im Vergleich, wie in der.

NativeBase Picker-Dokumentation und Migrationskontext beschrieben

Ein Infografik, die einen häufigen Fehler im NativeBase Picker-Komponenten auf Android und seine vorgeschlagene Lösung darstellt.

Was tatsächlich auf Android kaputt geht

Die praktische Ursache ist eine Implementierungsdetails. Auf Android hängt sich der NativeBase Picker an die native Spinner, und diese Schicht vermittelt keine Ereignislistener an den Wrapper, wie viele Entwickler erwarten. Auf iOS hängt sich die modalbasierte Verhaltensweise in das Ereignissystem ein.

Das ist der Grund, warum dieser Fehler so täuschend wirkt. Man sieht die Benutzeroberfläche. Man kann die Optionen öffnen. Man kann sogar ein sichtbares Element auswählen. Aber die Geschäftslogik läuft nie ab.

<Picker
  selectedValue={status}
  onValueChange={(value) => {
    setStatus(value);
    saveStatusToApi(value);
    trackSelection(value);
    updateDependentFields(value);
  }}
>

Ein typischer Fehlverhaltensmuster sieht so aus:

Ausweg, der in der Produktion hält

Der zuverlässigste Ausweg ist architektonisch, nicht kosmetisch. Halten Sie die Picker-Interaktion auf das Speichern eines ausgewählten Wertes, reagieren Sie dann auf Zustandsänderungen außerhalb des Picker-Handlers.

import React, { useEffect, useState } from 'react';
import { Form, Item, Picker } from 'native-base';

export default function StatusPicker() {
  const [status, setStatus] = useState('');
  const [didMount, setDidMount] = useState(false);

  useEffect(() => {
    if (!didMount) {
      setDidMount(true);
      return;
    }

    if (!status) return;

    runStatusSideEffects(status);
  }, [status, didMount]);

  const runStatusSideEffects = (value) => {
    console.log('Selected status:', value);
    // call validation, API sync, or dependent form updates here
  };

  return (
    <Form>
      <Item picker>
        <Picker
          selectedValue={status}
          onValueChange={setStatus}
        >
          <Picker.Item label="Select status" value="" />
          <Picker.Item label="Pending" value="pending" />
          <Picker.Item label="Approved" value="approved" />
          <Picker.Item label="Rejected" value="rejected" />
        </Picker>
      </Item>
    </Form>
  );
}

Wozu das hilft:

  • Der Zustand bleibt zentral: Ihr Komponentenlogik beobachtet status, nicht allein die Picker-Ereignis-Payload.
  • Die Nebenwirkungen werden explizit: API-Aufrufe, abhängige Feldaktualisierungen und Tracking leben nicht mehr in einem brüchigen UI-Aufruf.
  • Der code ist einfacher zu ersetzen: Wenn Sie sich von NativeBase Picker abwenden, überlebt die meisten Geschäftslogik unverändert.

Für Android-gewichtige Projekte empfehle ich außerdem, frühzeitig auf einem echten Gerät zu testen, insbesondere wenn Ihr App bereits native Paketierungs-Komplexität wie z.B. Android-Einrichtung für __CAPGO_KEEP_0__-Apps aufweist. Android-Einrichtung für Apps mit Capacitor-Funktionalität.

Wenn Sie zu Select migrieren, ist die Entscheidung für die saubere Lösung

Wenn der Picker in einem kritischen Workflow wie Checkout, Onboarding oder der Eingabe regulärer Daten sitzt, mag das Patchen um die alte Funktionalität nicht wert sein. An diesem Punkt ist die Migration zu NativeBase 3.0 Select normalerweise die sichere langfristige Wahl.

Der Fehler ist nicht nur ein Unannehmlichkeit. Er ändert, wo Sie Geschäftslogik sicher einsetzen können.

Wenn Sie das alte Picker behalten, behandeln Sie es als eine UI-Hülle mit minimaler Verantwortung. Diese Einstellung verhindert viele stille Android-Regressionsfehler.

Styling und Theming Ihres Picker-Komponents

Ein funktionierender Picker sieht noch unvollendet aus, wenn er nicht mit dem Rest der App übereinstimmt. NativeBase gibt Ihnen genügend Hooks, um das Steuerungselement gezielt zu gestalten, aber die saubersten Ergebnisse kommen oft von der Stylisierung der Umhüllung um den Picker anstatt von der direkten Auseinandersetzung mit dem nativen Steuerungselement.

Ein Bild einer Hand, die ein Smartphone hält, das ein Reisebuchungs-App mit einem Native-Base-Picker-Abwärtmenü anzeigt.

Stilen Sie die Umhüllung, bevor Sie den Picker stylisieren

Der Picker selbst ist zum Teil durch die nativen Rendering eingeschränkt. Die Umhüllung gibt Ihnen viel mehr Kontrolle über Abstände, Randbehandlung und Layoutrhythmus.

Ein praktisches Muster:

import React, { useState } from 'react';
import { StyleSheet } from 'react-native';
import { Form, Item, Picker, Icon } from 'native-base';

export default function StyledPicker() {
  const [country, setCountry] = useState('');

  return (
    <Form>
      <Item style={styles.pickerWrapper} picker>
        <Picker
          mode="dropdown"
          iosIcon={<Icon name="arrow-down" style={styles.icon} />}
          textStyle={styles.pickerText}
          selectedValue={country}
          onValueChange={setCountry}
        >
          <Picker.Item label="Select country" value="" />
          <Picker.Item label="Germany" value="de" />
          <Picker.Item label="Japan" value="jp" />
          <Picker.Item label="Brazil" value="br" />
        </Picker>
      </Item>
    </Form>
  );
}

const styles = StyleSheet.create({
  pickerWrapper: {
    borderWidth: 1,
    borderColor: '#D1D5DB',
    borderRadius: 10,
    marginTop: 12,
    paddingLeft: 8,
    backgroundColor: '#FFFFFF',
  },
  pickerText: {
    color: '#111827',
    fontSize: 16,
  },
  icon: {
    color: '#111827',
    fontSize: 18,
  },
});

Diese Vorgehensweise bringt Sie normalerweise am weitesten voran, ohne dass Sie die Theme-Überlagerungen übermäßig zu komplex machen.

Verwenden Sie eine plattformbewusste Darstellung

iOS und Android benötigen selten identische Stile. Sie benötigen eine konsistente Absicht. Das gleiche visuelle Token kann immer noch unterschiedliche Abstände, Icon-Platzierung oder Picker-Modus erfordern.

Nützliche Anpassungen umfassen:

  • Auf iOS: Geben Sie dem Feld Luft und achten Sie darauf, wie die modalen Darstellung sich zu den umliegenden Beschriftungen verhält.
  • Auf Android: Überprüfen Sie das Textklammern und die Standard-Spinner-Höhe auf mehreren Geräten.
  • Für beide: Halten Sie das Platzhalter-Text visuell von den realen Auswahlmöglichkeiten getrennt.

Ein kurzer Vergleich hilft:

Besorgnis iOS Android
Offenes Verhalten Modaler Look Spinner-Feel
Erwartungen an Icons Oft mehr dekorativ Oft mehr funktional
Abstandseffekte Das Layout von Placeholdern kann sich locker anfühlen Das Text kann sich eng anfühlen

Wenn Ihre UI Gradienten, übereinander liegende Karten oder hochempfindliche Oberflächen enthält, passen Sie die Wrapper des Pickers mit dem gleichen Behandlung an, wie Sie sie an anderen Stellen der Schnittstelle verwenden, ähnlich den Mustern, die in der Arbeit mit linearen Gradienten in React Native verwendet werden __CAPGO_KEEP_0__.

Entwurfshinweis: Benutzer beurteilen einen Picker weniger anhand des Dropdown-Menüs selbst und mehr daran, wie sich der geschlossene Feldbereich im Formular befindet.

Das ist der Grund, warum der Randradius, die Labelabstände und die Farbe des Platzhalterwerts wichtiger sind als exotische Picker-Kustomisierungen.

Erweiterte Szenarien und Best Practices

Die meisten Picker-Fehler treten nach dem Prototypen-Phase auf. Der Haken beginnt, wenn die Optionen von einem Server kommen, die Validierungsregeln je nach Plattform variieren und der Platzhalter nicht wie ein gültiger Wert handeln kann.

Eines der wiederkehrenden Randfälle ist besonders ärgerlich auf iOS. Entwickler müssen oft Picker-Werte von einem Server laden, während der Platzhalter-Eintrag nicht auswählbar sein soll. Doch offizielle Materialien behandeln diesen Weg nicht direkt ab. Die Community diskutiert, dass der Platzhalter-Wert auf iOS auswählbar bleiben kannwas zu inkonsistentem Verhalten in realen Apps führt, wie in dieser Diskussion der React Native Community über servergeladene Picker-Werte und die Auswahl des Platzhalters.

Eine Diagramm, das den vierstufigen Datenflussprozess für die Verwendung eines dynamischen Pickers in NativeBase illustriert.

Picker-Werte sicher von einem Server laden

Der Fehler, den ich am häufigsten sehe, ist, die abgerufenen Daten sofort als Picker-fertig zu behandeln. Halten Sie eine kleine Transformationsschicht zwischen Ihrem API-Antwort und dem Komponenten.

import React, { useEffect, useState } from 'react';
import { Form, Item, Picker } from 'native-base';

export default function DynamicCategoryPicker() {
  const [categories, setCategories] = useState([]);
  const [selectedCategory, setSelectedCategory] = useState('');

  useEffect(() => {
    const loadCategories = async () => {
      const response = await fetch('https://example.com/api/categories');
      const data = await response.json();

      const formatted = data.map((item) => ({
        label: item.name,
        value: String(item.id),
      }));

      setCategories(formatted);
    };

    loadCategories();
  }, []);

  return (
    <Form>
      <Item picker>
        <Picker
          selectedValue={selectedCategory}
          onValueChange={setSelectedCategory}
        >
          <Picker.Item label="Select category" value="" />
          {categories.map((item) => (
            <Picker.Item
              key={item.value}
              label={item.label}
              value={item.value}
            />
          ))}
        </Picker>
      </Item>
    </Form>
  );
}

Diese Formatierungsschritt gibt Ihnen einen stabilen Vertrag. Ihr Picker muss nicht wissen, wie der API innen aussieht.

Verhindern Sie die Auswahl des Platzhalters auf iOS

Die sicherste Regel ist einfach. Behandeln Sie den Platzhalter nicht als echte Option, selbst wenn die UI-Bibliothek es leicht macht, einen zu rendern.

Ein praktisches Muster:

  • Verwenden Sie einen leeren Sentinel-Wert: Halten Sie den Platzhalterwert als '' oder einen anderen ungültigen Anwendungs-Wert.
  • Validieren Sie vor dem Absenden: Ablehnen Sie den leeren Wert in der Formvalidierung, nicht nur in der UI.
  • Deaktivieren Sie die nachgelagerten Aktionen: Aktivieren Sie den Absendeknopf nicht, bis ein nicht-leerer Wert existiert.

Für strengere Flüsse, rendern Sie Hilfetext, wenn der Platzhalter weiterhin ausgewählt bleibt:

const isValidSelection = selectedCategory !== '';

Dann sperren Sie Ihre Aktionstasten oder API-Aufrufe von dieser Bedingung ab, anstatt sich auf die Darstellung des Pickers zu verlassen.

Barrierefreiheit und Produktionsgewohnheiten

Pickern gelingt es oft, durch Barrierefreiheitsprüfungen zu schlüpfen, weil sie native aussehen. Sie benötigen jedoch klare Beschriftungen und vorhersehbare Zustände.

Einige Gewohnheiten bringen schnell Erfolge:

  • Fügen Sie Barrierefreiheitsbeschriftungen hinzu: Machen Sie das Feld für Screenreader verständlich:
  • Halten Sie Beschriftungen explizit: "Land" ist besser als "Wählen".
  • Testen Sie die Wiederherstellung des Zustands: Öffnen Sie ein Formular erneut und bestätigen Sie, dass das zuvor ausgewählte Element korrekt angezeigt wird.
  • Schreiben Sie Einheitstests um die logik, die durch die Auswahl getrieben wird: Die Logik außerhalb der Benutzeroberfläche ist am wichtigsten, und Einheitstesten für die React-Verhaltensweise Hilft Ihnen dabei, diese Zustandsübergänge zu schützen.

Eine Picker ist selten von sich aus geschäftskritisch. Die dahinterliegenden Zustandsänderungen sind es meistens.

Das ist der Geist, der dynamische Formen stabil hält. Behandeln Sie den NativeBase Picker als Eingabefläche. Legen Sie die tatsächlichen Regeln in Ihrem Zustand, Ihrer Validierung und Ihrer Abgabefluss an.

Zusammenfassung

Der NativeBase Picker ist immer noch nützlich, wenn Sie verstehen, wo er bricht. Die Einrichtung ist unkompliziert, die Gestaltung ist machbar und servergetriebene Optionenlisten sind handhabbar. Ein kritischer Fall ist die Android-Event-Verarbeitung. Wenn Sie das Geschäftslogik aus den brüchigen Picker-Aufrufen herausbewegen und sie in Zustandsgetriebene Effekte einbauen, wird das Komponente viel vorhersehbarer.

Für ältere Codebasen ist das Workaround oft ausreichend. Für kritische Flüsse ist die Migration zu Select ist in der Regel der bessere Investition. Egal, wie Sie vorgehen, der Schlüssel ist derselbe. Vertrauen Sie dem Picker nicht einfach nur, weil er sich rendern lässt.


Wenn Ihr Team Capacitor oder Electron-Apps bereitstellt und JavaScript, CSS, Kopien, Konfigurationen und Asset-Änderungen ohne Wartezeit auf die Store-Überprüfung durchführen möchte Capgo ist es wert, einen Blick zu werfen. Es bietet Ihnen signierte Live-Updates, Rollout-Kontrolle, Rückrufschutz und Freigabeanzeige, damit Sie schneller wiederherstellen können, wenn UI-Bugs wie Picker-Regressions in die Produktion entkommen.

Live-Updates für Capacitor-Apps

Wenn ein Web-Schicht-Bug aktiv ist, schicken Sie die Reparatur über Capgo anstatt Tage für die Genehmigung des App-Stores zu warten. Die Benutzer erhalten die Aktualisierung im Hintergrund, während native Änderungen im normalen Review-Prozess bleiben.

Menschliche Unterstützung von Martin

Los geht's jetzt

Neueste von unserem Blog

Capgo gibt Ihnen die besten Einblicke, die Sie benötigen, um ein wirklich professionelles Mobiltelefon-App zu erstellen.