Flutter Templates
Erstellung einer E-Commerce-App mit Flutter, Back4App und Stripe-Integration über Cloud Code
49 min
einführung die entwicklung einer e commerce app umfasst mehrere komponenten, darunter produktlisten, funktionen des warenkorbs, sichere zahlungsabwicklung, bestellverfolgung und benutzerbewertungen die kombination von flutters leistungsstarkem ui toolkit mit den skalierbaren backend diensten von back4app vereinfacht den entwicklungsprozess darüber hinaus ermöglicht die integration von stripe für die zahlungsabwicklung über back4app cloud code eine sichere und professionelle transaktionsabwicklung in diesem tutorial werden sie eine e commerce app mit den folgenden funktionen erstellen produktlisten produkte mit bildern, beschreibungen und preisen anzeigen warenkorb produkte zum warenkorb hinzufügen und entfernen benutzerkonten benutzerprofile und adressen verwalten sicherer checkout zahlungen sicher über stripe via back4app cloud code abwickeln bestellverfolgung bestellstatus und verlauf verfolgen bewertungen und bewertungen benutzern ermöglichen, bewertungen und bewertungen abzugeben voraussetzungen um dieses tutorial zu befolgen, benötigen sie flutter sdk auf ihrem computer installiert folgen sie dem flutter installationshandbuch https //flutter dev/docs/get started/install grundkenntnisse in flutter und dart eine ide oder einen texteditor wie visual studio code oder android studio ein back4app konto melden sie sich bei back4app https //www back4app com/ an stripe konto melden sie sich bei stripe https //stripe com/ an, um api schlüssel zu erhalten node js und npm installiert für die entwicklung von cloud code schritt 1 – einrichten des flutter projekts 1 1 erstellen sie ein neues flutter projekt öffnen sie ihr terminal und führen sie aus flutter create ecommerce app navigieren sie zum projektverzeichnis cd ecommerce app 1 2 abhängigkeiten hinzufügen öffnen sie pubspec yaml und fügen sie die folgenden abhängigkeiten hinzu dependencies flutter sdk flutter parse server sdk flutter ^4 0 1 provider ^6 0 0 cached network image ^3 2 0 flutter stripe ^5 2 0 uuid ^3 0 6 führen sie flutter pub get aus, um die pakete zu installieren hinweis parse server sdk flutter für die back4app integration provider für das state management cached network image für effizientes laden von bildern flutter stripe für die stripe integration auf der client seite uuid zur generierung eindeutiger identifikatoren schritt 2 – back4app einrichten 2 1 erstellen sie eine neue back4app anwendung melden sie sich bei ihrem back4app dashboard https //dashboard back4app com/ an klicken sie auf "neue app erstellen" geben sie "ecommerceapp" als anwendungsnamen ein und klicken sie auf "erstellen" 2 2 einrichten der datenmodelle wir müssen mehrere klassen in back4app erstellen produkt benutzer (integrierte klasse) bestellung bestellposition bewertung 2 2 1 produktklasse navigieren sie zu der "datenbank" sektion klicken sie auf "eine klasse erstellen" wählen sie "benutzerdefiniert" und geben sie "produkt" als klassennamen ein fügen sie die folgenden spalten hinzu name string beschreibung string preis zahl bild datei kategorie string lagerbestand zahl 2 2 2 bestellklasse erstellen sie eine "bestellung" klasse mit den folgenden spalten benutzer pointer< user> gesamtbetrag zahl status string (werte "ausstehend", "bezahlt", "versendet", "zugestellt") paymentintentid string (um stripe zahlung zu verfolgen) versandadresse string 2 2 3 bestellposition klasse erstellen sie eine "orderitem" klasse mit den folgenden spalten bestellung zeiger produkt zeiger menge zahl preis zahl 2 2 4 bewertungs klasse erstellen sie eine "review" klasse mit den folgenden spalten produkt zeiger benutzer zeiger< user> bewertung zahl kommentar string 2 3 anwendungsanmeldeinformationen erhalten navigieren sie zu app einstellungen > sicherheit & schlüssel notieren sie sich ihre anwendungs id und client schlüssel schritt 3 – implementierung des produktmanagements 3 1 initialisierung von parse in flutter öffnen sie lib/main dart und ändern sie es import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; import 'package\ provider/provider dart'; import 'screens/home screen dart'; import 'services/product service dart'; void main() async { widgetsflutterbinding ensureinitialized(); const keyapplicationid = 'your application id'; const keyclientkey = 'your client key'; const keyparseserverurl = 'https //parseapi back4app com'; await parse() initialize( keyapplicationid, keyparseserverurl, clientkey keyclientkey, autosendsessionid true, debug true, ); runapp(myapp()); } class myapp extends statelesswidget { @override widget build(buildcontext context) { return changenotifierprovider\<productservice>( create ( ) => productservice(), child materialapp( title 'e commerce app', theme themedata( primaryswatch colors blue, ), home homescreen(), ), ); } } ersetzen sie 'your application id' und 'your client key' durch ihre back4app anmeldeinformationen 3 2 erstellen des produktmodells erstellen sie ein verzeichnis models unter lib und fügen sie product dart // lib/models/product dart class product { string id; string name; string description; double price; string imageurl; string category; int inventory; product({ required this id, required this name, required this description, required this price, required this imageurl, required this category, required this inventory, }); } 3 3 implementierung des produktdienstes erstellen sie ein verzeichnis services unter lib und fügen sie product service dart // lib/services/product service dart import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; import ' /models/product dart'; class productservice with changenotifier { list\<product> products = \[]; future\<void> fetchproducts() async { final query = querybuilder\<parseobject>(parseobject('product')); final response = await query query(); if (response success && response results != null) { products = response results! map((data) { return product( id data objectid!, name data get\<string>('name')!, description data get\<string>('description')!, price data get\<num>('price')! todouble(), imageurl data get\<parsefilebase>('image')! url!, category data get\<string>('category')!, inventory data get\<num>('inventory')! toint(), ); }) tolist(); notifylisteners(); } } } 3 4 erstellen des startbildschirms erstellen sie screens verzeichnis unter lib und fügen sie home screen dart // lib/screens/home screen dart import 'package\ flutter/material dart'; import 'package\ provider/provider dart'; import ' /services/product service dart'; import 'product detail screen dart'; class homescreen extends statefulwidget { @override homescreenstate createstate() => homescreenstate(); } class homescreenstate extends state\<homescreen> { late productservice productservice; @override void initstate() { super initstate(); productservice = provider of\<productservice>(context, listen false); productservice fetchproducts(); } @override widget build(buildcontext context) { return scaffold( appbar appbar( title text('e commerce app'), actions \[ iconbutton( icon icon(icons shopping cart), onpressed () { // navigate to cart screen (to be implemented) }, ), ], ), body consumer\<productservice>( builder (context, productservice, child) { if (productservice products isempty) { return center(child circularprogressindicator()); } return gridview\ builder( padding edgeinsets all(8 0), itemcount productservice products length, griddelegate slivergriddelegatewithfixedcrossaxiscount( crossaxiscount 2, childaspectratio 0 75, ), itembuilder (context, index) { final product = productservice products\[index]; return gesturedetector( ontap () { navigator push( context, materialpageroute( builder ( ) => productdetailscreen(product product), ), ); }, child card( child column( children \[ expanded( child image network( product imageurl, fit boxfit cover, ), ), text(product name), text('\\$${product price tostringasfixed(2)}'), ], ), ), ); }, ); }, ), ); } } 3 5 produktdetailbildschirm erstellen sie product detail screen dart unter lib/screens/ // lib/screens/product detail screen dart import 'package\ flutter/material dart'; import ' /models/product dart'; import ' /services/cart service dart'; import 'package\ provider/provider dart'; class productdetailscreen extends statelesswidget { final product product; productdetailscreen({required this product}); @override widget build(buildcontext context) { final cartservice = provider of\<cartservice>(context); return scaffold( appbar appbar(title text(product name)), body column( children \[ expanded(child image network(product imageurl)), padding( padding const edgeinsets all(16 0), child text(product description), ), text('\\$${product price tostringasfixed(2)}'), elevatedbutton( onpressed () { cartservice addtocart(product); scaffoldmessenger of(context) showsnackbar( snackbar(content text('added to cart')), ); }, child text('add to cart'), ), ], ), ); } } schritt 4 – implementierung von benutzerkonten 4 1 authentifizierungsdienst fügen sie auth service dart unter lib/services/ // lib/services/auth service dart import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; class authservice with changenotifier { parseuser? user; future\<bool> signup(string username, string password, string email) async { user = parseuser createuser(username, password, email); final response = await user! signup(); if (response success) { notifylisteners(); return true; } else { user = null; return false; } } future\<bool> login(string username, string password) async { user = parseuser(username, password, null); final response = await user! login(); if (response success) { notifylisteners(); return true; } else { user = null; return false; } } future\<void> logout() async { if (user != null) { await user! logout(); user = null; notifylisteners(); } } bool get isauthenticated => user != null; } 4 2 authentifizierungsbildschirme erstellen sie login screen dart und signup screen dart unter lib/screens/ anmeldeseite // lib/screens/login screen dart import 'package\ flutter/material dart'; import 'package\ provider/provider dart'; import ' /services/auth service dart'; import 'home screen dart'; import 'signup screen dart'; class loginscreen extends statelesswidget { final texteditingcontroller usernamecontroller = texteditingcontroller(); final texteditingcontroller passwordcontroller = texteditingcontroller(); void login(buildcontext context) async { final authservice = provider of\<authservice>(context, listen false); bool success = await authservice login( usernamecontroller text trim(), passwordcontroller text trim(), ); if (success) { navigator pushreplacement( context, materialpageroute(builder ( ) => homescreen()), ); } else { scaffoldmessenger of(context) showsnackbar(snackbar(content text('login failed'))); } } @override widget build(buildcontext context) { return scaffold( appbar appbar( title text('e commerce app login'), ), body padding( padding const edgeinsets all(16), child column( children \[ textfield( controller usernamecontroller, decoration inputdecoration(labeltext 'username or email'), ), textfield( controller passwordcontroller, decoration inputdecoration(labeltext 'password'), obscuretext true, ), sizedbox(height 20), elevatedbutton( onpressed () => login(context), child text('login'), ), textbutton( onpressed () { navigator push( context, materialpageroute(builder ( ) => signupscreen()), ); }, child text('don\\'t have an account? sign up'), ) ], ), ), ); } } registrierungsseite // lib/screens/signup screen dart import 'package\ flutter/material dart'; import 'package\ provider/provider dart'; import ' /services/auth service dart'; import 'home screen dart'; class signupscreen extends statelesswidget { final texteditingcontroller usernamecontroller = texteditingcontroller(); final texteditingcontroller emailcontroller = texteditingcontroller(); final texteditingcontroller passwordcontroller = texteditingcontroller(); void signup(buildcontext context) async { final authservice = provider of\<authservice>(context, listen false); bool success = await authservice signup( usernamecontroller text trim(), passwordcontroller text trim(), emailcontroller text trim(), ); if (success) { navigator pushreplacement( context, materialpageroute(builder ( ) => homescreen()), ); } else { scaffoldmessenger of(context) showsnackbar(snackbar(content text('signup failed'))); } } @override widget build(buildcontext context) { return scaffold( appbar appbar( title text('e commerce app signup'), ), body padding( padding const edgeinsets all(16), child column( children \[ textfield( controller usernamecontroller, decoration inputdecoration(labeltext 'username'), ), textfield( controller emailcontroller, decoration inputdecoration(labeltext 'email'), ), textfield( controller passwordcontroller, decoration inputdecoration(labeltext 'password'), obscuretext true, ), sizedbox(height 20), elevatedbutton( onpressed () => signup(context), child text('sign up'), ), ], ), ), ); } } 4 3 hauptaktualisierung zur einbeziehung von authservice in main dart , um die materialapp mit multiprovider // in main dart class myapp extends statelesswidget { @override widget build(buildcontext context) { return multiprovider( providers \[ changenotifierprovider\<productservice>( create ( ) => productservice(), ), changenotifierprovider\<authservice>( create ( ) => authservice(), ), changenotifierprovider\<cartservice>( create ( ) => cartservice(), ), ], child materialapp( // ), ); } } 4 4 weiterleitung basierend auf dem authentifizierungsstatus ändern sie main dart um den authentifizierungsstatus zu überprüfen // main dart // inside the build method home consumer\<authservice>( builder (context, authservice, child) { if (authservice isauthenticated) { return homescreen(); } else { return loginscreen(); } }, ), schritt 5 – einkaufswagen funktionalität 5 1 erstelle den warenkorb service fügen sie cart service dart unter lib/services/ // lib/services/cart service dart import 'package\ flutter/material dart'; import ' /models/product dart'; class cartitem { final product product; int quantity; cartitem({required this product, this quantity = 1}); } class cartservice with changenotifier { map\<string, cartitem> items = {}; void addtocart(product product) { if ( items containskey(product id)) { items\[product id]! quantity++; } else { items\[product id] = cartitem(product product); } notifylisteners(); } void removefromcart(string productid) { items remove(productid); notifylisteners(); } void clearcart() { items clear(); notifylisteners(); } map\<string, cartitem> get items => items; double get totalamount { double total = 0 0; items foreach((key, cartitem) { total += cartitem product price cartitem quantity; }); return total; } } 5 2 erstellen sie den warenkorb bildschirm fügen sie cart screen dart unter lib/screens/ // lib/screens/cart screen dart import 'package\ flutter/material dart'; import 'package\ provider/provider dart'; import ' /services/cart service dart'; import 'checkout screen dart'; class cartscreen extends statelesswidget { @override widget build(buildcontext context) { final cartservice = provider of\<cartservice>(context); final cartitems = cartservice items values tolist(); return scaffold( appbar appbar(title text('your cart')), body column( children \[ expanded( child listview\ builder( itemcount cartservice items length, itembuilder (context, index) { final cartitem = cartitems\[index]; return listtile( leading image network(cartitem product imageurl), title text(cartitem product name), subtitle text('quantity ${cartitem quantity}'), trailing text('\\$${(cartitem product price cartitem quantity) tostringasfixed(2)}'), ); }, ), ), text('total \\$${cartservice totalamount tostringasfixed(2)}'), elevatedbutton( onpressed () { navigator push( context, materialpageroute(builder ( ) => checkoutscreen()), ); }, child text('proceed to checkout'), ), ], ), ); } } schritt 6 – sicherer checkout mit stripe integration über cloud code 6 1 stripe konto einrichten melden sie sich für ein stripe konto https //dashboard stripe com/register an holen sie sich ihren publishable key und secret key im stripe dashboard unter entwickler > api schlüssel 6 2 stripe sdk im cloud code installieren back4app unterstützt cloud code funktionen, die in javascript geschrieben sind wir werden cloud code funktionen schreiben, um die zahlungsabwicklung zu verwalten 6 2 1 cloud code projekt erstellen gehen sie in ihrem back4app app dashboard zu app einstellungen > cloud code funktionen klicken sie auf "code bearbeiten" um den cloud code editor zu öffnen 6 2 2 npm initialisieren und stripe paket installieren führen sie im cloud code terminal (im editor bereitgestellt) aus npm init y npm install stripe\@8 174 0 hinweis back4app's cloud code verwendet node js version 14 x, stellen sie also die kompatibilität sicher 6 3 erstellen sie eine cloud funktion für die zahlungsabsicht erstellen oder ändern sie main js im cloud code editor // main js const stripe = require('stripe'); const stripe = stripe('your stripe secret key'); parse cloud define('createpaymentintent', async (request) => { const { amount, currency } = request params; try { const paymentintent = await stripe paymentintents create({ amount amount, currency currency, }); return { clientsecret paymentintent client secret }; } catch (error) { throw new parse error(500, error message); } }); ersetzen sie 'your stripe secret key' durch ihren tatsächlichen stripe geheimschlüssel sicherheitsnotiz geben sie ihren geheimen schlüssel niemals auf der client seite preis halten sie ihn im cloud code sicher 6 4 cloud code bereitstellen klicken sie auf "bereitstellen" im cloud code editor, um ihre funktionen bereitzustellen 6 5 implementierung der zahlung in flutter 6 5 1 stripe in flutter initialisieren in main dart , nach parse() initialize , hinzufügen import 'package\ flutter stripe/flutter stripe dart'; // inside main() async stripe publishablekey = 'your stripe publishable key'; ersetzen sie 'ihre stripe publishable key' durch ihren stripe publishable key 6 5 2 checkout bildschirm erstellen fügen sie checkout screen dart unter lib/screens/ // lib/screens/checkout screen dart import 'package\ flutter/material dart'; import 'package\ provider/provider dart'; import ' /services/cart service dart'; import 'package\ flutter stripe/flutter stripe dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; import 'order confirmation screen dart'; class checkoutscreen extends statelesswidget { future\<void> processpayment(buildcontext context) async { final cartservice = provider of\<cartservice>(context, listen false); final totalamount = (cartservice totalamount 100) toint(); // amount in cents // call cloud function to create payment intent final response = await parsecloudfunction('createpaymentintent') execute( parameters { 'amount' totalamount, 'currency' 'usd', }, ); if (response success) { final clientsecret = response result\['clientsecret']; // initialize payment sheet await stripe instance initpaymentsheet( paymentsheetparameters setuppaymentsheetparameters( paymentintentclientsecret clientsecret, merchantdisplayname 'your e commerce app', ), ); // display payment sheet await stripe instance presentpaymentsheet(); // payment successful // save order to back4app (to be implemented) cartservice clearcart(); navigator pushreplacement( context, materialpageroute(builder ( ) => orderconfirmationscreen()), ); } else { scaffoldmessenger of(context) showsnackbar( snackbar(content text('payment failed ${response error! message}')), ); } } @override widget build(buildcontext context) { final cartservice = provider of\<cartservice>(context); return scaffold( appbar appbar(title text('checkout')), body column( children \[ text('total \\$${cartservice totalamount tostringasfixed(2)}'), elevatedbutton( onpressed () => processpayment(context), child text('pay now'), ), ], ), ); } } 6 5 3 zahlungsbestätigung behandeln erstellen sie order confirmation screen dart unter lib/screens/ // lib/screens/order confirmation screen dart import 'package\ flutter/material dart'; class orderconfirmationscreen extends statelesswidget { @override widget build(buildcontext context) { return scaffold( appbar appbar( title text('order confirmed'), automaticallyimplyleading false, ), body center( child text('thank you for your purchase!'), ), ); } } 6 6 bestellung in back4app speichern ändern sie die processpayment methode, um die bestelldaten zu speichern // after successful payment final authservice = provider of\<authservice>(context, listen false); final user = authservice user!; // create order object final order = parseobject('order') set('user', user) set('totalamount', cartservice totalamount) set('status', 'paid') set('paymentintentid', clientsecret); // save order final orderresponse = await order save(); if (orderresponse success) { final orderobject = orderresponse result; // save orderitems for (var cartitem in cartservice items values) { final orderitem = parseobject('orderitem') set('order', orderobject) set('product', parseobject('product') objectid = cartitem product id) set('quantity', cartitem quantity) set('price', cartitem product price); await orderitem save(); } // clear cart and navigate cartservice clearcart(); navigator pushreplacement( context, materialpageroute(builder ( ) => orderconfirmationscreen()), ); } else { scaffoldmessenger of(context) showsnackbar( snackbar(content text('failed to save order')), ); } schritt 7 – bestellverfolgung 7 1 bestellservice erstellen fügen sie order service dart unter lib/services/ // lib/services/order service dart import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; import ' /models/order dart'; class orderservice with changenotifier { list\<order> orders = \[]; future\<void> fetchorders(parseuser user) async { final query = querybuilder\<parseobject>(parseobject('order')) whereequalto('user', user) orderbydescending('createdat'); final response = await query query(); if (response success && response results != null) { orders = response results! map((data) { return order fromparseobject(data); }) tolist(); notifylisteners(); } } } 7 2 bestellmodell erstellen fügen sie order dart unter lib/models/ // lib/models/order dart import 'package\ parse server sdk flutter/parse server sdk dart'; class order { string id; double totalamount; string status; datetime createdat; order({ required this id, required this totalamount, required this status, required this createdat, }); factory order fromparseobject(parseobject object) { return order( id object objectid!, totalamount object get\<num>('totalamount')! todouble(), status object get\<string>('status')!, createdat object createdat!, ); } } 7 3 bestellbildschirm erstellen fügen sie orders screen dart unter lib/screens/ // lib/screens/orders screen dart import 'package\ flutter/material dart'; import 'package\ provider/provider dart'; import ' /services/order service dart'; import ' /services/auth service dart'; import ' /models/order dart'; class ordersscreen extends statefulwidget { @override ordersscreenstate createstate() => ordersscreenstate(); } class ordersscreenstate extends state\<ordersscreen> { late orderservice orderservice; @override void initstate() { super initstate(); orderservice = provider of\<orderservice>(context, listen false); final authservice = provider of\<authservice>(context, listen false); orderservice fetchorders(authservice user!); } @override widget build(buildcontext context) { return scaffold( appbar appbar(title text('your orders')), body consumer\<orderservice>( builder (context, orderservice, child) { if (orderservice orders isempty) { return center(child text('no orders found ')); } return listview\ builder( itemcount orderservice orders length, itembuilder (context, index) { final order = orderservice orders\[index]; return listtile( title text('order #${order id}'), subtitle text('status ${order status}'), trailing text('\\$${order totalamount tostringasfixed(2)}'), ); }, ); }, ), ); } } schritt 8 – bewertungen und rezensionen 8 1 bewertungsdienst erstellen fügen sie review service dart unter lib/services/ // lib/services/review service dart import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; import ' /models/review\ dart'; class reviewservice with changenotifier { list\<review> reviews = \[]; future\<void> fetchreviews(string productid) async { final query = querybuilder\<parseobject>(parseobject('review')) whereequalto('product', parseobject('product') objectid = productid) includeobject(\['user']); final response = await query query(); if (response success && response results != null) { reviews = response results! map((data) { return review\ fromparseobject(data); }) tolist(); notifylisteners(); } } future\<void> submitreview(string productid, parseuser user, int rating, string comment) async { final review = parseobject('review') set('product', parseobject('product') objectid = productid) set('user', user) set('rating', rating) set('comment', comment); await review\ save(); await fetchreviews(productid); } } 8 2 erstellen sie das bewertungsmodell fügen sie review\ dart unter lib/models/ // lib/models/review\ dart import 'package\ parse server sdk flutter/parse server sdk dart'; class review { string id; int rating; string comment; parseuser user; review({ required this id, required this rating, required this comment, required this user, }); factory review\ fromparseobject(parseobject object) { return review( id object objectid!, rating object get\<num>('rating')! toint(), comment object get\<string>('comment')!, user object get\<parseuser>('user')!, ); } } 8 3 aktualisieren sie den produktdetailbildschirm in product detail screen dart , fügen sie einen abschnitt hinzu, um bewertungen anzuzeigen und einzureichen // at the end of the column in productdetailscreen expanded( child column( children \[ // display reviews expanded( child consumer\<reviewservice>( builder (context, reviewservice, child) { if (reviewservice reviews isempty) { return center(child text('no reviews yet ')); } return listview\ builder( itemcount reviewservice reviews length, itembuilder (context, index) { final review = reviewservice reviews\[index]; return listtile( title text(review\ user username ?? 'anonymous'), subtitle text(review\ comment), trailing text('${review\ rating}/5'), ); }, ); }, ), ), // submit review textfield( controller reviewcontroller, decoration inputdecoration(hinttext 'write a review'), ), row( children \[ text('rating '), dropdownbutton\<int>( value rating, onchanged (value) { setstate(() { rating = value!; }); }, items list generate(5, (index) => index + 1) map((e) => dropdownmenuitem(value e, child text('$e'))) tolist(), ), elevatedbutton( onpressed () { final authservice = provider of\<authservice>(context, listen false); reviewservice submitreview( product id, authservice user!, rating, reviewcontroller text trim(), ); reviewcontroller clear(); }, child text('submit'), ), ], ), ], ), ), fazit in diesem umfassenden tutorial haben sie eine e commerce app mit flutter und back4app erstellt, die mit stripe für die sichere zahlungsabwicklung über cloud code integriert ist sie haben wichtige funktionen wie produktlisten, einkaufswagenfunktionalität, benutzerauthentifizierung, bestellverfolgung und bewertungen implementiert wichtige erkenntnisse back4app integration vereinfacht das backend management für ihre flutter app stripe integration über cloud code verarbeitet zahlungen sicher, ohne sensible schlüssel offenzulegen modulare architektur die trennung von diensten und modellen verbessert die wartbarkeit nächste schritte sicherheit verbessern implementieren sie eine ordnungsgemäße fehlerbehandlung und eingangsvalidierung ui/ux verbesserungen verfeinern sie die benutzeroberfläche für ein besseres benutzererlebnis bestandsverwaltung aktualisieren sie den produktbestand nach dem kauf e mail benachrichtigungen senden sie bestellbestätigungs e mails an die benutzer admin panel erstellen sie eine admin oberfläche zur verwaltung von produkten und bestellungen zusätzliche ressourcen back4app dokumentation https //www back4app com/docs parse server anleitung https //docs parseplatform org/ flutter offizielle dokumentation https //flutter dev/docs stripe api referenz https //stripe com/docs/api flutter stripe paket https //pub dev/packages/flutter stripe viel spaß beim programmieren!