4 Commits

Author SHA1 Message Date
Matej Bačo
0e067feb31 Downgrade dart 2025-03-11 13:28:51 +00:00
Matej Bačo
1ae5710a63 Merge pull request #2 from appwrite/env-support
Env support
2025-03-11 14:22:39 +01:00
Darshan
e314312082 Merge pull request #1 from appwrite/feat-starter-kit
Feat: Starter Kit for Flutter
2025-02-25 11:29:28 +05:30
Darshan
ff0c12e23d address comments. 2025-02-25 09:24:01 +05:30
9 changed files with 140 additions and 161 deletions

19
lib/app.dart Normal file
View File

@@ -0,0 +1,19 @@
import 'package:appwrite_flutter_starter_kit/home.dart';
import 'package:flutter/material.dart';
class AppwriteApp extends StatelessWidget {
const AppwriteApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Appwrite StarterKit',
debugShowCheckedModeBanner: false,
theme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
home: const AppwriteStarterKit(),
);
}
}

75
lib/home.dart Normal file
View File

@@ -0,0 +1,75 @@
import 'package:appwrite_flutter_starter_kit/data/models/log.dart';
import 'package:appwrite_flutter_starter_kit/data/models/status.dart';
import 'package:appwrite_flutter_starter_kit/data/repository/appwrite_repository.dart';
import 'package:appwrite_flutter_starter_kit/ui/components/checkered_background.dart';
import 'package:appwrite_flutter_starter_kit/ui/components/collapsible_bottomsheet.dart';
import 'package:appwrite_flutter_starter_kit/ui/components/connection_status_view.dart';
import 'package:appwrite_flutter_starter_kit/ui/components/getting_started_cards.dart';
import 'package:appwrite_flutter_starter_kit/ui/components/top_platform_view.dart';
import 'package:appwrite_flutter_starter_kit/utils/extensions/build_context.dart';
import 'package:flutter/material.dart';
class AppwriteStarterKit extends StatefulWidget {
const AppwriteStarterKit({super.key});
@override
State<AppwriteStarterKit> createState() => _AppwriteStarterKit();
}
class _AppwriteStarterKit extends State<AppwriteStarterKit> {
final List<Log> _logs = [];
Status _status = Status.idle;
final AppwriteRepository _repository = AppwriteRepository();
@override
Widget build(BuildContext context) {
return Scaffold(
body: CheckeredBackground(
child: SafeArea(
minimum: EdgeInsets.only(top: context.isLargeScreen ? 24 : 16),
child: Stack(
children: [
SingleChildScrollView(
child: Column(
spacing: 16,
children: [
TopPlatformView(status: _status),
ConnectionStatusView(
status: _status,
onButtonClick: () async {
setState(() => _status = Status.loading);
final log = await _repository.ping();
_logs.add(log);
await Future.delayed(
const Duration(milliseconds: 1250),
);
setState(
() => _status =
(200 <= log.status && log.status <= 399)
? Status.success
: Status.error,
);
},
),
GettingStartedCards()
],
),
),
// bottomsheet
Align(
alignment: Alignment.bottomCenter,
child: CollapsibleBottomSheet(
logs: _logs,
projectInfo: _repository.getProjectInfo(),
),
),
],
),
),
),
);
}
}

View File

@@ -1,98 +1,8 @@
import 'package:appwrite_flutter_starter_kit/data/models/log.dart'; import 'package:appwrite_flutter_starter_kit/app.dart';
import 'package:appwrite_flutter_starter_kit/data/models/status.dart';
import 'package:appwrite_flutter_starter_kit/data/repository/appwrite_repository.dart';
import 'package:appwrite_flutter_starter_kit/ui/components/checkered_background.dart';
import 'package:appwrite_flutter_starter_kit/ui/components/collapsible_bottomsheet.dart';
import 'package:appwrite_flutter_starter_kit/ui/components/connection_status_view.dart';
import 'package:appwrite_flutter_starter_kit/ui/components/getting_started_cards.dart';
import 'package:appwrite_flutter_starter_kit/ui/components/top_platform_view.dart';
import 'package:appwrite_flutter_starter_kit/utils/app_initializer.dart'; import 'package:appwrite_flutter_starter_kit/utils/app_initializer.dart';
import 'package:appwrite_flutter_starter_kit/utils/extensions/build_context.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
void main() async { void main() async {
await AppInitializer.initialize(); await AppInitializer.initialize();
runApp(AppwriteApp()); runApp(AppwriteApp());
} }
class AppwriteApp extends StatelessWidget {
const AppwriteApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Appwrite StarterKit',
debugShowCheckedModeBanner: false,
theme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
home: const AppwriteStarterKit(),
);
}
}
class AppwriteStarterKit extends StatefulWidget {
const AppwriteStarterKit({super.key});
@override
State<AppwriteStarterKit> createState() => _AppwriteStarterKit();
}
class _AppwriteStarterKit extends State<AppwriteStarterKit> {
final List<Log> _logs = [];
Status _status = Status.idle;
final AppwriteRepository _repository = AppwriteRepository();
@override
Widget build(BuildContext context) {
return Scaffold(
body: CheckeredBackground(
child: SafeArea(
minimum: EdgeInsets.only(top: context.isLargeScreen ? 24 : 16),
child: Stack(
children: [
SingleChildScrollView(
child: Column(
spacing: context.isLargeScreen ? 64 : 32,
children: [
TopPlatformView(status: _status),
ConnectionStatusView(
status: _status,
onButtonClick: () async {
setState(() => _status = Status.loading);
final log = await _repository.ping();
_logs.add(log);
await Future.delayed(
const Duration(milliseconds: 1250),
);
setState(
() => _status =
(200 <= log.status && log.status <= 399)
? Status.success
: Status.error,
);
},
),
GettingStartedCards()
],
),
),
// bottomsheet
Align(
alignment: Alignment.bottomCenter,
child: CollapsibleBottomSheet(
logs: _logs,
projectInfo: _repository.getProjectInfo(),
),
),
],
),
),
),
);
}
}

View File

@@ -491,7 +491,7 @@ class LogsTableRow extends StatelessWidget {
child: MouseRegion( child: MouseRegion(
cursor: SystemMouseCursors.click, cursor: SystemMouseCursors.click,
child: Text( child: Text(
response.length > 50 ? response.substring(0, 50) : response, response.substring(0, 50),
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: const TextStyle( style: const TextStyle(

View File

@@ -15,7 +15,7 @@ class ConnectionLine extends StatelessWidget {
return SizedBox( return SizedBox(
width: context.widthFactor( width: context.widthFactor(
mobileFactor: 0.25, mobileFactor: 0.25,
largeScreenFactor: 0.125, largeScreenFactor: 0.15,
), ),
child: Flex( child: Flex(
direction: Axis.horizontal, direction: Axis.horizontal,

View File

@@ -2,30 +2,6 @@ import 'package:appwrite_flutter_starter_kit/utils/extensions/build_context.dart
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
const cardWidgets = [
GeneralInfoCard(
title: "Edit your app",
link: null,
subtitle: HighlightedText(),
),
GeneralInfoCard(
title: "Head to Appwrite Cloud",
link: "https://cloud.appwrite.io",
subtitle: Text(
"Start managing your project from the Appwrite console",
style: TextStyle(fontSize: 14, color: Color(0xFF56565C)),
),
),
GeneralInfoCard(
title: "Explore docs",
link: "https://appwrite.io/docs",
subtitle: Text(
"Discover the full power of Appwrite by diving into our documentation",
style: TextStyle(fontSize: 14, color: Color(0xFF56565C)),
),
),
];
/// A widget that contains a list of informational cards displayed vertically. /// A widget that contains a list of informational cards displayed vertically.
class GettingStartedCards extends StatelessWidget { class GettingStartedCards extends StatelessWidget {
const GettingStartedCards({super.key}); const GettingStartedCards({super.key});
@@ -33,28 +9,39 @@ class GettingStartedCards extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Padding(
padding: const EdgeInsets.all(16.0), padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 16.0),
child: context.isLargeScreen child: Column(
? Wrap( mainAxisSize: MainAxisSize.min,
spacing: 16, children: [
runSpacing: 16, GeneralInfoCard(
alignment: WrapAlignment.center, title: "Edit your app",
children: cardWidgets link: null,
.map((card) => SizedBox( subtitle: const HighlightedText(),
width: 350, ),
child: card, GeneralInfoCard(
)) title: "Head to Appwrite Cloud",
.toList(), link: "https://cloud.appwrite.io",
) subtitle: const Text(
: Column( "Start managing your project from the Appwrite console",
mainAxisSize: MainAxisSize.min, style: TextStyle(
children: cardWidgets fontSize: 14,
.map((card) => Padding( color: Color(0xFF56565C),
padding: const EdgeInsets.only(bottom: 16), ),
child: card,
))
.toList(),
), ),
),
GeneralInfoCard(
title: "Explore docs",
link: "https://appwrite.io/docs",
subtitle: const Text(
"Discover the full power of Appwrite by diving into our documentation",
style: TextStyle(
fontSize: 14,
color: Color(0xFF56565C),
),
),
),
],
),
); );
} }
} }

View File

@@ -1,6 +1,5 @@
import 'package:appwrite_flutter_starter_kit/data/models/status.dart'; import 'package:appwrite_flutter_starter_kit/data/models/status.dart';
import 'package:appwrite_flutter_starter_kit/ui/icons/appwrite.dart'; import 'package:appwrite_flutter_starter_kit/ui/icons/appwrite.dart';
import 'package:appwrite_flutter_starter_kit/utils/extensions/build_context.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'connection_line.dart'; import 'connection_line.dart';
@@ -19,24 +18,13 @@ class TopPlatformView extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Padding( return Row(
// web has extra padding on top. mainAxisAlignment: MainAxisAlignment.center,
padding: children: <Widget>[
context.isLargeScreen ? EdgeInsets.only(top: 85) : EdgeInsets.zero, PlatformIcon(child: FlutterLogo(size: 40)),
child: Row( ConnectionLine(show: status == Status.success),
mainAxisAlignment: MainAxisAlignment.center, PlatformIcon(child: AppwriteIcon(size: 40)),
children: <Widget>[ ],
PlatformIcon(
size: context.isLargeScreen ? 185 : 100,
child: FlutterLogo(size: context.isLargeScreen ? 100 : 40),
),
ConnectionLine(show: status == Status.success),
PlatformIcon(
size: context.isLargeScreen ? 185 : 100,
child: AppwriteIcon(size: context.isLargeScreen ? 100 : 40),
),
],
),
); );
} }
} }
@@ -63,7 +51,7 @@ class PlatformIcon extends StatelessWidget {
height: size, height: size,
decoration: BoxDecoration( decoration: BoxDecoration(
color: const Color(0xFFFAFAFD), color: const Color(0xFFFAFAFD),
borderRadius: BorderRadius.circular(context.isLargeScreen ? 44 : 24), borderRadius: BorderRadius.circular(24),
border: Border.all(color: const Color(0x0A19191C), width: 1), border: Border.all(color: const Color(0x0A19191C), width: 1),
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
@@ -79,7 +67,7 @@ class PlatformIcon extends StatelessWidget {
height: size * 0.86, height: size * 0.86,
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(context.isLargeScreen ? 32 : 16), borderRadius: BorderRadius.circular(16),
border: Border.all(color: const Color(0xFFFAFAFB), width: 1), border: Border.all(color: const Color(0xFFFAFAFB), width: 1),
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class AppwriteIcon extends StatelessWidget { class AppwriteIcon extends StatelessWidget {
final double size; final double size; // Desired width, height scales accordingly
final Color color; final Color color;
const AppwriteIcon({ const AppwriteIcon({

View File

@@ -5,7 +5,7 @@ publish_to: 'none'
version: 1.0.0 version: 1.0.0
environment: environment:
sdk: ^3.6.0 sdk: ^3.5.4
dependencies: dependencies:
flutter: flutter: