🎉 Initial Commit

This commit is contained in:
2024-04-13 00:38:20 +08:00
commit dd1354d99c
139 changed files with 5175 additions and 0 deletions

4
lib/i18n/app_en.arb Normal file
View File

@ -0,0 +1,4 @@
{
"solian": "Solian",
"explore": "Explore"
}

4
lib/i18n/app_zh.arb Normal file
View File

@ -0,0 +1,4 @@
{
"solian": "HAIYAA",
"explore": "探索"
}

43
lib/main.dart Normal file
View File

@ -0,0 +1,43 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:solian/providers/layout_provider.dart';
import 'package:solian/router.dart';
import 'package:solian/widgets/wrapper.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
void main() {
runApp(const SolianApp());
}
class SolianApp extends StatelessWidget {
const SolianApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp.router(
title: 'Solian',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.indigo),
useMaterial3: true,
),
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
routerConfig: router,
builder: (context, child) {
return Overlay(
initialEntries: [
OverlayEntry(builder: (context) {
return Provider(
create: (_) => LayoutConfig(context),
child: LayoutWrapper(
child: child,
),
);
})
],
);
},
);
}
}

View File

@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class LayoutConfig {
String title = "Solian";
LayoutConfig(BuildContext context) {
title = AppLocalizations.of(context)!.solian;
}
}

12
lib/router.dart Normal file
View File

@ -0,0 +1,12 @@
import 'package:go_router/go_router.dart';
import 'package:solian/screens/explore.dart';
final router = GoRouter(
routes: [
GoRoute(
path: '/',
name: 'explore',
builder: (context, state) => const ExploreScreen(),
),
],
);

29
lib/screens/explore.dart Normal file
View File

@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:solian/providers/layout_provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class ExploreScreen extends StatefulWidget {
const ExploreScreen({super.key});
@override
State<ExploreScreen> createState() => _ExploreScreenState();
}
class _ExploreScreenState extends State<ExploreScreen> {
@override
void initState() {
Future.delayed(Duration.zero, () {
context.read<LayoutConfig>().title = AppLocalizations.of(context)!.explore;
});
super.initState();
}
@override
Widget build(BuildContext context) {
return const Center(
child: Text("Woah"),
);
}
}

View File

@ -0,0 +1,57 @@
import 'package:flutter/material.dart';
import 'package:solian/router.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class SolianNavigationDrawer extends StatefulWidget {
const SolianNavigationDrawer({super.key});
@override
State<SolianNavigationDrawer> createState() => _SolianNavigationDrawerState();
}
class _SolianNavigationDrawerState extends State<SolianNavigationDrawer> {
var _selectedIndex = 0;
void _onSelect(String name, int idx) {
setState(() => _selectedIndex = idx);
router.goNamed(name);
}
@override
Widget build(BuildContext context) {
final navigationItems = [
(
NavigationDrawerDestination(
icon: const Icon(Icons.explore),
label: Text(AppLocalizations.of(context)!.explore),
),
"explore",
),
];
return NavigationDrawer(
selectedIndex: _selectedIndex,
onDestinationSelected: (int idx) {
final element = navigationItems[idx];
_onSelect(element.$2, idx);
},
children: [
Padding(
padding: const EdgeInsets.fromLTRB(28, 16, 16, 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Image.asset("assets/logo.png", width: 26, height: 26),
const SizedBox(width: 10),
Text(
AppLocalizations.of(context)!.solian,
style: const TextStyle(fontWeight: FontWeight.w900),
),
],
),
),
...navigationItems.map((x) => x.$1)
],
);
}
}

33
lib/widgets/wrapper.dart Normal file
View File

@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:solian/providers/layout_provider.dart';
import 'package:solian/widgets/navigation_drawer.dart';
class LayoutWrapper extends StatelessWidget {
final Widget? child;
const LayoutWrapper({super.key, this.child});
@override
Widget build(BuildContext context) {
var cfg = context.watch<LayoutConfig>();
return Scaffold(
drawer: const SolianNavigationDrawer(),
body: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverAppBar(
title: Text(cfg.title),
elevation: 10.0,
expandedHeight: 50,
floating: true,
snap: true,
),
];
},
body: child ?? Container(),
),
);
}
}