>:NDEBUG>")
47 | endfunction()
48 |
49 | # Flutter library and tool build rules.
50 | set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
51 | add_subdirectory(${FLUTTER_MANAGED_DIR})
52 |
53 | # System-level dependencies.
54 | find_package(PkgConfig REQUIRED)
55 | pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
56 |
57 | add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
58 |
59 | # Define the application target. To change its name, change BINARY_NAME above,
60 | # not the value here, or `flutter run` will no longer work.
61 | #
62 | # Any new source files that you add to the application should be added here.
63 | add_executable(${BINARY_NAME}
64 | "main.cc"
65 | "my_application.cc"
66 | "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
67 | )
68 |
69 | # Apply the standard set of build settings. This can be removed for applications
70 | # that need different build settings.
71 | apply_standard_settings(${BINARY_NAME})
72 |
73 | # Add dependency libraries. Add any application-specific dependencies here.
74 | target_link_libraries(${BINARY_NAME} PRIVATE flutter)
75 | target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
76 |
77 | # Run the Flutter tool portions of the build. This must not be removed.
78 | add_dependencies(${BINARY_NAME} flutter_assemble)
79 |
80 | # Only the install-generated bundle's copy of the executable will launch
81 | # correctly, since the resources must in the right relative locations. To avoid
82 | # people trying to run the unbundled copy, put it in a subdirectory instead of
83 | # the default top-level location.
84 | set_target_properties(${BINARY_NAME}
85 | PROPERTIES
86 | RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run"
87 | )
88 |
89 | # Generated plugin build rules, which manage building the plugins and adding
90 | # them to the application.
91 | include(flutter/generated_plugins.cmake)
92 |
93 |
94 | # === Installation ===
95 | # By default, "installing" just makes a relocatable bundle in the build
96 | # directory.
97 | set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle")
98 | if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
99 | set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
100 | endif()
101 |
102 | # Start with a clean build bundle directory every time.
103 | install(CODE "
104 | file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\")
105 | " COMPONENT Runtime)
106 |
107 | set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
108 | set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
109 |
110 | install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
111 | COMPONENT Runtime)
112 |
113 | install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
114 | COMPONENT Runtime)
115 |
116 | install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
117 | COMPONENT Runtime)
118 |
119 | foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
120 | install(FILES "${bundled_library}"
121 | DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
122 | COMPONENT Runtime)
123 | endforeach(bundled_library)
124 |
125 | # Fully re-copy the assets directory on each build to avoid having stale files
126 | # from a previous install.
127 | set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
128 | install(CODE "
129 | file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
130 | " COMPONENT Runtime)
131 | install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
132 | DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
133 |
134 | # Install the AOT library on non-Debug builds only.
135 | if(NOT CMAKE_BUILD_TYPE MATCHES "Debug")
136 | install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
137 | COMPONENT Runtime)
138 | endif()
139 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Full source code
2 | # Flutter 3.0 & Rest API from scratch, build a mini Store app
3 |
4 | [][youtube]
5 | [][udemy]
6 | [][github]
7 | [][github]
8 | [][linkedin]
9 | [][facebook]
10 |
11 |
12 |
17 |
18 |
19 |
20 |
21 |
22 | Flutter 3.0 & Rest API from scratch,
build a mini Store app
23 |
24 | - ⭐
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | Press here for the UI source code
UI source code
36 |
37 |
38 |
39 |
40 |
41 |
42 | Press here for the starter source code
starter source code
43 |
44 |
45 |
46 |
47 |
48 |
53 |
54 |
55 |
56 |
57 |
58 |
59 | Flutter 3.0&Rest API crash course
build a News app from zero
60 |
61 | 5.0 ⭐
62 |
63 |
64 |
65 |
66 |
67 |
68 | Flutter with Firebase&Stripe
Build shop app from scratch
69 |
70 | 4.4 ⭐
71 |
72 |
73 |
74 |
75 |
76 |
77 | Flutter 2.2 & Firebase,
build a complete app from scratch [EN]
78 |
79 | 4.7 ⭐
80 |
81 |
82 |
83 |
84 |
85 |
86 | Flutter 2.2 & Firebase,
build a complete app from scratch [AR]
87 |
88 | 4.8 ⭐
89 |
90 |
91 |
92 |
93 |
98 |
99 |
100 |
101 |
102 |
103 |
104 | Flutter helper kit
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 | Flutter helper kit
(Light)
113 |
114 |
115 |
116 |
117 |
118 | [udemy]: https://www.udemy.com/user/hadi-kachmar-2/
119 | [youtube]: https://www.youtube.com/channel/UCTGDYkqUtgCelc6G09LUm6w
120 | [linkedin]: https://www.linkedin.com/in/hadi-kachmar-27a56a177/
121 | [github]: https://github.com/hadikachmar3
122 | [email]: mailto:flutterer.dev@gmail.com
123 | [facebook]: https://www.facebook.com/Coding-with-Hadi-113431577650864/
124 |
125 |
--------------------------------------------------------------------------------
/lib/screens/product_details.dart:
--------------------------------------------------------------------------------
1 | import 'dart:developer';
2 |
3 | import 'package:card_swiper/card_swiper.dart';
4 | import 'package:fancy_shimmer_image/fancy_shimmer_image.dart';
5 | import 'package:flutter/material.dart';
6 | import 'package:store_api_flutter_course/models/products_model.dart';
7 | import 'package:store_api_flutter_course/services/api_handler.dart';
8 |
9 | import '../consts/global_colors.dart';
10 |
11 | class ProductDetails extends StatefulWidget {
12 | const ProductDetails({
13 | Key? key,
14 | required this.id,
15 | }) : super(key: key);
16 | final String id;
17 | @override
18 | State createState() => _ProductDetailsState();
19 | }
20 |
21 | class _ProductDetailsState extends State {
22 | final titleStyle = const TextStyle(fontSize: 24, fontWeight: FontWeight.bold);
23 | ProductsModel? productsModel;
24 | bool isError = false;
25 | String errorStr = "";
26 | Future getProductInfo() async {
27 | try {
28 | productsModel = await APIHandler.getProductById(id: widget.id);
29 | } catch (error) {
30 | isError = true;
31 | errorStr = error.toString();
32 | log("error $error");
33 | }
34 | setState(() {});
35 | }
36 |
37 | @override
38 | void didChangeDependencies() {
39 | getProductInfo();
40 | super.didChangeDependencies();
41 | }
42 |
43 | @override
44 | Widget build(BuildContext context) {
45 | Size size = MediaQuery.of(context).size;
46 | return Scaffold(
47 | body: SafeArea(
48 | child: isError
49 | ? Center(
50 | child: Text(
51 | "An error occured $errorStr",
52 | style: const TextStyle(
53 | fontSize: 25, fontWeight: FontWeight.w500),
54 | ),
55 | )
56 | : productsModel == null
57 | ? const Center(
58 | child: CircularProgressIndicator(),
59 | )
60 | : SingleChildScrollView(
61 | child: Column(
62 | crossAxisAlignment: CrossAxisAlignment.start,
63 | mainAxisAlignment: MainAxisAlignment.start,
64 | children: [
65 | const SizedBox(
66 | height: 18,
67 | ),
68 | const BackButton(),
69 | Padding(
70 | padding: const EdgeInsets.all(8.0),
71 | child: Column(
72 | crossAxisAlignment: CrossAxisAlignment.start,
73 | children: [
74 | Text(
75 | productsModel!.category!.name.toString(),
76 | style: const TextStyle(
77 | fontSize: 20, fontWeight: FontWeight.w500),
78 | ),
79 | const SizedBox(
80 | height: 18,
81 | ),
82 | Row(
83 | mainAxisAlignment:
84 | MainAxisAlignment.spaceBetween,
85 | children: [
86 | Flexible(
87 | flex: 3,
88 | child: Text(
89 | productsModel!.title.toString(),
90 | textAlign: TextAlign.start,
91 | style: titleStyle,
92 | ),
93 | ),
94 | Flexible(
95 | flex: 1,
96 | child: RichText(
97 | text: TextSpan(
98 | text: '\$',
99 | style: const TextStyle(
100 | fontSize: 25,
101 | color: Color.fromRGBO(
102 | 33, 150, 243, 1)),
103 | children: [
104 | TextSpan(
105 | text: productsModel!.price
106 | .toString(),
107 | style: TextStyle(
108 | color: lightTextColor,
109 | fontWeight:
110 | FontWeight.bold)),
111 | ]),
112 | ),
113 | ),
114 | ],
115 | ),
116 | const SizedBox(
117 | height: 18,
118 | ),
119 | ],
120 | ),
121 | ),
122 | SizedBox(
123 | height: size.height * 0.4,
124 | child: Swiper(
125 | itemBuilder: (BuildContext context, int index) {
126 | return FancyShimmerImage(
127 | width: double.infinity,
128 | imageUrl:
129 | productsModel!.images![index].toString(),
130 | boxFit: BoxFit.fill,
131 | );
132 | },
133 |
134 | autoplay: true,
135 | itemCount: 3,
136 | pagination: const SwiperPagination(
137 | alignment: Alignment.bottomCenter,
138 | builder: DotSwiperPaginationBuilder(
139 | color: Colors.white,
140 | activeColor: Colors.red,
141 | ),
142 | ),
143 | // control: const SwiperControl(),
144 | ),
145 | ),
146 | const SizedBox(
147 | height: 18,
148 | ),
149 | Padding(
150 | padding: const EdgeInsets.all(8.0),
151 | child: Column(
152 | crossAxisAlignment: CrossAxisAlignment.start,
153 | children: [
154 | Text('Description', style: titleStyle),
155 | const SizedBox(
156 | height: 18,
157 | ),
158 | Text(
159 | productsModel!.description.toString(),
160 | textAlign: TextAlign.start,
161 | style: const TextStyle(fontSize: 25),
162 | ),
163 | ],
164 | ),
165 | ),
166 | ],
167 | ),
168 | ),
169 | ),
170 | );
171 | }
172 | }
173 |
--------------------------------------------------------------------------------
/lib/screens/home_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:card_swiper/card_swiper.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:flutter_iconly/flutter_iconly.dart';
4 | import 'package:page_transition/page_transition.dart';
5 | import 'package:store_api_flutter_course/consts/global_colors.dart';
6 | import 'package:store_api_flutter_course/screens/categories_screen.dart';
7 | import 'package:store_api_flutter_course/screens/feeds_screen.dart';
8 | import 'package:store_api_flutter_course/screens/users_screen.dart';
9 | import 'package:store_api_flutter_course/services/api_handler.dart';
10 |
11 | import '../models/products_model.dart';
12 | import '../widgets/appbar_icons.dart';
13 | import '../widgets/feeds_grid.dart';
14 | import '../widgets/feeds_widget.dart';
15 | import '../widgets/sale_widget.dart';
16 |
17 | class HomeScreen extends StatefulWidget {
18 | const HomeScreen({Key? key}) : super(key: key);
19 |
20 | @override
21 | State createState() => _HomeScreenState();
22 | }
23 |
24 | class _HomeScreenState extends State {
25 | late TextEditingController _textEditingController;
26 | // List productsList = [];
27 | @override
28 | void initState() {
29 | _textEditingController = TextEditingController();
30 | super.initState();
31 | }
32 |
33 | @override
34 | void dispose() {
35 | _textEditingController.dispose();
36 | super.dispose();
37 | }
38 |
39 | // @override
40 | // void didChangeDependencies() {
41 | // getProducts();
42 | // super.didChangeDependencies();
43 | // }
44 |
45 | // Future getProducts() async {
46 | // productsList = await APIHandler.getAllProducts();
47 | // setState(() {});
48 | // }
49 |
50 | @override
51 | Widget build(BuildContext context) {
52 | Size size = MediaQuery.of(context).size;
53 | return GestureDetector(
54 | onTap: () {
55 | FocusScope.of(context).unfocus();
56 | },
57 | child: Scaffold(
58 | appBar: AppBar(
59 | // elevation: 4,
60 | title: const Text('Home'),
61 | leading: AppBarIcons(
62 | function: () {
63 | Navigator.push(
64 | context,
65 | PageTransition(
66 | type: PageTransitionType.fade,
67 | child: const CategoriesScreen(),
68 | ),
69 | );
70 | },
71 | icon: IconlyBold.category,
72 | ),
73 | actions: [
74 | AppBarIcons(
75 | function: () {
76 | Navigator.push(
77 | context,
78 | PageTransition(
79 | type: PageTransitionType.fade,
80 | child: const UsersScreen(),
81 | ),
82 | );
83 | },
84 | icon: IconlyBold.user3,
85 | ),
86 | ],
87 | ),
88 | body: Padding(
89 | padding: const EdgeInsets.all(8.0),
90 | child: Column(
91 | children: [
92 | const SizedBox(
93 | height: 18,
94 | ),
95 | TextField(
96 | controller: _textEditingController,
97 | keyboardType: TextInputType.text,
98 | decoration: InputDecoration(
99 | hintText: "Search",
100 | filled: true,
101 | fillColor: Theme.of(context).cardColor,
102 | enabledBorder: OutlineInputBorder(
103 | borderRadius: BorderRadius.circular(10.0),
104 | borderSide: BorderSide(
105 | color: Theme.of(context).cardColor,
106 | ),
107 | ),
108 | focusedBorder: OutlineInputBorder(
109 | borderRadius: BorderRadius.circular(10.0),
110 | borderSide: BorderSide(
111 | width: 1,
112 | color: Theme.of(context).colorScheme.secondary,
113 | ),
114 | ),
115 | suffixIcon: Icon(
116 | IconlyLight.search,
117 | color: lightIconsColor,
118 | )),
119 | ),
120 | const SizedBox(
121 | height: 18,
122 | ),
123 | Expanded(
124 | child: SingleChildScrollView(
125 | child: Column(children: [
126 | SizedBox(
127 | height: size.height * 0.25,
128 | child: Swiper(
129 | itemCount: 3,
130 | itemBuilder: (ctx, index) {
131 | return const SaleWidget();
132 | },
133 | autoplay: true,
134 | pagination: const SwiperPagination(
135 | alignment: Alignment.bottomCenter,
136 | builder: DotSwiperPaginationBuilder(
137 | color: Colors.white,
138 | activeColor: Colors.red)),
139 | // control: const SwiperControl(),
140 | ),
141 | ),
142 | Padding(
143 | padding: const EdgeInsets.all(8.0),
144 | child: Row(
145 | children: [
146 | const Text(
147 | "Latest Products",
148 | style: TextStyle(
149 | fontWeight: FontWeight.w600,
150 | fontSize: 18,
151 | ),
152 | ),
153 | const Spacer(),
154 | AppBarIcons(
155 | function: () {
156 | Navigator.push(
157 | context,
158 | PageTransition(
159 | type: PageTransitionType.fade,
160 | child: const FeedsScreen()));
161 | },
162 | icon: IconlyBold.arrowRight2),
163 | ],
164 | ),
165 | ),
166 | FutureBuilder>(
167 | future: APIHandler.getAllProducts(limit: "3"),
168 | builder: ((context, snapshot) {
169 | if (snapshot.connectionState ==
170 | ConnectionState.waiting) {
171 | return const Center(
172 | child: CircularProgressIndicator(),
173 | );
174 | } else if (snapshot.hasError) {
175 | Center(
176 | child:
177 | Text("An error occured ${snapshot.error}"),
178 | );
179 | } else if (snapshot.data == null) {
180 | const Center(
181 | child: Text("No products has been added yet"),
182 | );
183 | }
184 | return FeedsGridWidget(
185 | productsList: snapshot.data!);
186 | }))
187 | ]),
188 | ),
189 | )
190 | ],
191 | ),
192 | )),
193 | );
194 | }
195 | }
196 |
--------------------------------------------------------------------------------
/windows/runner/win32_window.cpp:
--------------------------------------------------------------------------------
1 | #include "win32_window.h"
2 |
3 | #include
4 |
5 | #include "resource.h"
6 |
7 | namespace {
8 |
9 | constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW";
10 |
11 | // The number of Win32Window objects that currently exist.
12 | static int g_active_window_count = 0;
13 |
14 | using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);
15 |
16 | // Scale helper to convert logical scaler values to physical using passed in
17 | // scale factor
18 | int Scale(int source, double scale_factor) {
19 | return static_cast(source * scale_factor);
20 | }
21 |
22 | // Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.
23 | // This API is only needed for PerMonitor V1 awareness mode.
24 | void EnableFullDpiSupportIfAvailable(HWND hwnd) {
25 | HMODULE user32_module = LoadLibraryA("User32.dll");
26 | if (!user32_module) {
27 | return;
28 | }
29 | auto enable_non_client_dpi_scaling =
30 | reinterpret_cast(
31 | GetProcAddress(user32_module, "EnableNonClientDpiScaling"));
32 | if (enable_non_client_dpi_scaling != nullptr) {
33 | enable_non_client_dpi_scaling(hwnd);
34 | FreeLibrary(user32_module);
35 | }
36 | }
37 |
38 | } // namespace
39 |
40 | // Manages the Win32Window's window class registration.
41 | class WindowClassRegistrar {
42 | public:
43 | ~WindowClassRegistrar() = default;
44 |
45 | // Returns the singleton registar instance.
46 | static WindowClassRegistrar* GetInstance() {
47 | if (!instance_) {
48 | instance_ = new WindowClassRegistrar();
49 | }
50 | return instance_;
51 | }
52 |
53 | // Returns the name of the window class, registering the class if it hasn't
54 | // previously been registered.
55 | const wchar_t* GetWindowClass();
56 |
57 | // Unregisters the window class. Should only be called if there are no
58 | // instances of the window.
59 | void UnregisterWindowClass();
60 |
61 | private:
62 | WindowClassRegistrar() = default;
63 |
64 | static WindowClassRegistrar* instance_;
65 |
66 | bool class_registered_ = false;
67 | };
68 |
69 | WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;
70 |
71 | const wchar_t* WindowClassRegistrar::GetWindowClass() {
72 | if (!class_registered_) {
73 | WNDCLASS window_class{};
74 | window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);
75 | window_class.lpszClassName = kWindowClassName;
76 | window_class.style = CS_HREDRAW | CS_VREDRAW;
77 | window_class.cbClsExtra = 0;
78 | window_class.cbWndExtra = 0;
79 | window_class.hInstance = GetModuleHandle(nullptr);
80 | window_class.hIcon =
81 | LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
82 | window_class.hbrBackground = 0;
83 | window_class.lpszMenuName = nullptr;
84 | window_class.lpfnWndProc = Win32Window::WndProc;
85 | RegisterClass(&window_class);
86 | class_registered_ = true;
87 | }
88 | return kWindowClassName;
89 | }
90 |
91 | void WindowClassRegistrar::UnregisterWindowClass() {
92 | UnregisterClass(kWindowClassName, nullptr);
93 | class_registered_ = false;
94 | }
95 |
96 | Win32Window::Win32Window() {
97 | ++g_active_window_count;
98 | }
99 |
100 | Win32Window::~Win32Window() {
101 | --g_active_window_count;
102 | Destroy();
103 | }
104 |
105 | bool Win32Window::CreateAndShow(const std::wstring& title,
106 | const Point& origin,
107 | const Size& size) {
108 | Destroy();
109 |
110 | const wchar_t* window_class =
111 | WindowClassRegistrar::GetInstance()->GetWindowClass();
112 |
113 | const POINT target_point = {static_cast(origin.x),
114 | static_cast(origin.y)};
115 | HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);
116 | UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);
117 | double scale_factor = dpi / 96.0;
118 |
119 | HWND window = CreateWindow(
120 | window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
121 | Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
122 | Scale(size.width, scale_factor), Scale(size.height, scale_factor),
123 | nullptr, nullptr, GetModuleHandle(nullptr), this);
124 |
125 | if (!window) {
126 | return false;
127 | }
128 |
129 | return OnCreate();
130 | }
131 |
132 | // static
133 | LRESULT CALLBACK Win32Window::WndProc(HWND const window,
134 | UINT const message,
135 | WPARAM const wparam,
136 | LPARAM const lparam) noexcept {
137 | if (message == WM_NCCREATE) {
138 | auto window_struct = reinterpret_cast(lparam);
139 | SetWindowLongPtr(window, GWLP_USERDATA,
140 | reinterpret_cast(window_struct->lpCreateParams));
141 |
142 | auto that = static_cast(window_struct->lpCreateParams);
143 | EnableFullDpiSupportIfAvailable(window);
144 | that->window_handle_ = window;
145 | } else if (Win32Window* that = GetThisFromHandle(window)) {
146 | return that->MessageHandler(window, message, wparam, lparam);
147 | }
148 |
149 | return DefWindowProc(window, message, wparam, lparam);
150 | }
151 |
152 | LRESULT
153 | Win32Window::MessageHandler(HWND hwnd,
154 | UINT const message,
155 | WPARAM const wparam,
156 | LPARAM const lparam) noexcept {
157 | switch (message) {
158 | case WM_DESTROY:
159 | window_handle_ = nullptr;
160 | Destroy();
161 | if (quit_on_close_) {
162 | PostQuitMessage(0);
163 | }
164 | return 0;
165 |
166 | case WM_DPICHANGED: {
167 | auto newRectSize = reinterpret_cast(lparam);
168 | LONG newWidth = newRectSize->right - newRectSize->left;
169 | LONG newHeight = newRectSize->bottom - newRectSize->top;
170 |
171 | SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,
172 | newHeight, SWP_NOZORDER | SWP_NOACTIVATE);
173 |
174 | return 0;
175 | }
176 | case WM_SIZE: {
177 | RECT rect = GetClientArea();
178 | if (child_content_ != nullptr) {
179 | // Size and position the child window.
180 | MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,
181 | rect.bottom - rect.top, TRUE);
182 | }
183 | return 0;
184 | }
185 |
186 | case WM_ACTIVATE:
187 | if (child_content_ != nullptr) {
188 | SetFocus(child_content_);
189 | }
190 | return 0;
191 | }
192 |
193 | return DefWindowProc(window_handle_, message, wparam, lparam);
194 | }
195 |
196 | void Win32Window::Destroy() {
197 | OnDestroy();
198 |
199 | if (window_handle_) {
200 | DestroyWindow(window_handle_);
201 | window_handle_ = nullptr;
202 | }
203 | if (g_active_window_count == 0) {
204 | WindowClassRegistrar::GetInstance()->UnregisterWindowClass();
205 | }
206 | }
207 |
208 | Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
209 | return reinterpret_cast(
210 | GetWindowLongPtr(window, GWLP_USERDATA));
211 | }
212 |
213 | void Win32Window::SetChildContent(HWND content) {
214 | child_content_ = content;
215 | SetParent(content, window_handle_);
216 | RECT frame = GetClientArea();
217 |
218 | MoveWindow(content, frame.left, frame.top, frame.right - frame.left,
219 | frame.bottom - frame.top, true);
220 |
221 | SetFocus(child_content_);
222 | }
223 |
224 | RECT Win32Window::GetClientArea() {
225 | RECT frame;
226 | GetClientRect(window_handle_, &frame);
227 | return frame;
228 | }
229 |
230 | HWND Win32Window::GetHandle() {
231 | return window_handle_;
232 | }
233 |
234 | void Win32Window::SetQuitOnClose(bool quit_on_close) {
235 | quit_on_close_ = quit_on_close;
236 | }
237 |
238 | bool Win32Window::OnCreate() {
239 | // No-op; provided for subclasses.
240 | return true;
241 | }
242 |
243 | void Win32Window::OnDestroy() {
244 | // No-op; provided for subclasses.
245 | }
246 |
--------------------------------------------------------------------------------
/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://dart.dev/tools/pub/glossary#lockfile
3 | packages:
4 | async:
5 | dependency: transitive
6 | description:
7 | name: async
8 | url: "https://pub.dartlang.org"
9 | source: hosted
10 | version: "2.8.2"
11 | boolean_selector:
12 | dependency: transitive
13 | description:
14 | name: boolean_selector
15 | url: "https://pub.dartlang.org"
16 | source: hosted
17 | version: "2.1.0"
18 | cached_network_image:
19 | dependency: transitive
20 | description:
21 | name: cached_network_image
22 | url: "https://pub.dartlang.org"
23 | source: hosted
24 | version: "3.2.1"
25 | cached_network_image_platform_interface:
26 | dependency: transitive
27 | description:
28 | name: cached_network_image_platform_interface
29 | url: "https://pub.dartlang.org"
30 | source: hosted
31 | version: "1.0.0"
32 | cached_network_image_web:
33 | dependency: transitive
34 | description:
35 | name: cached_network_image_web
36 | url: "https://pub.dartlang.org"
37 | source: hosted
38 | version: "1.0.1"
39 | card_swiper:
40 | dependency: "direct main"
41 | description:
42 | name: card_swiper
43 | url: "https://pub.dartlang.org"
44 | source: hosted
45 | version: "2.0.4"
46 | characters:
47 | dependency: transitive
48 | description:
49 | name: characters
50 | url: "https://pub.dartlang.org"
51 | source: hosted
52 | version: "1.2.0"
53 | charcode:
54 | dependency: transitive
55 | description:
56 | name: charcode
57 | url: "https://pub.dartlang.org"
58 | source: hosted
59 | version: "1.3.1"
60 | clock:
61 | dependency: transitive
62 | description:
63 | name: clock
64 | url: "https://pub.dartlang.org"
65 | source: hosted
66 | version: "1.1.0"
67 | collection:
68 | dependency: transitive
69 | description:
70 | name: collection
71 | url: "https://pub.dartlang.org"
72 | source: hosted
73 | version: "1.16.0"
74 | crypto:
75 | dependency: transitive
76 | description:
77 | name: crypto
78 | url: "https://pub.dartlang.org"
79 | source: hosted
80 | version: "3.0.2"
81 | cupertino_icons:
82 | dependency: "direct main"
83 | description:
84 | name: cupertino_icons
85 | url: "https://pub.dartlang.org"
86 | source: hosted
87 | version: "1.0.5"
88 | fake_async:
89 | dependency: transitive
90 | description:
91 | name: fake_async
92 | url: "https://pub.dartlang.org"
93 | source: hosted
94 | version: "1.3.0"
95 | fancy_shimmer_image:
96 | dependency: "direct main"
97 | description:
98 | name: fancy_shimmer_image
99 | url: "https://pub.dartlang.org"
100 | source: hosted
101 | version: "2.0.2"
102 | ffi:
103 | dependency: transitive
104 | description:
105 | name: ffi
106 | url: "https://pub.dartlang.org"
107 | source: hosted
108 | version: "2.0.1"
109 | file:
110 | dependency: transitive
111 | description:
112 | name: file
113 | url: "https://pub.dartlang.org"
114 | source: hosted
115 | version: "6.1.2"
116 | flutter:
117 | dependency: "direct main"
118 | description: flutter
119 | source: sdk
120 | version: "0.0.0"
121 | flutter_blurhash:
122 | dependency: transitive
123 | description:
124 | name: flutter_blurhash
125 | url: "https://pub.dartlang.org"
126 | source: hosted
127 | version: "0.7.0"
128 | flutter_cache_manager:
129 | dependency: transitive
130 | description:
131 | name: flutter_cache_manager
132 | url: "https://pub.dartlang.org"
133 | source: hosted
134 | version: "3.3.0"
135 | flutter_iconly:
136 | dependency: "direct main"
137 | description:
138 | name: flutter_iconly
139 | url: "https://pub.dartlang.org"
140 | source: hosted
141 | version: "1.0.2"
142 | flutter_lints:
143 | dependency: "direct dev"
144 | description:
145 | name: flutter_lints
146 | url: "https://pub.dartlang.org"
147 | source: hosted
148 | version: "2.0.1"
149 | flutter_test:
150 | dependency: "direct dev"
151 | description: flutter
152 | source: sdk
153 | version: "0.0.0"
154 | http:
155 | dependency: transitive
156 | description:
157 | name: http
158 | url: "https://pub.dartlang.org"
159 | source: hosted
160 | version: "0.13.4"
161 | http_parser:
162 | dependency: transitive
163 | description:
164 | name: http_parser
165 | url: "https://pub.dartlang.org"
166 | source: hosted
167 | version: "4.0.1"
168 | lints:
169 | dependency: transitive
170 | description:
171 | name: lints
172 | url: "https://pub.dartlang.org"
173 | source: hosted
174 | version: "2.0.0"
175 | matcher:
176 | dependency: transitive
177 | description:
178 | name: matcher
179 | url: "https://pub.dartlang.org"
180 | source: hosted
181 | version: "0.12.11"
182 | material_color_utilities:
183 | dependency: transitive
184 | description:
185 | name: material_color_utilities
186 | url: "https://pub.dartlang.org"
187 | source: hosted
188 | version: "0.1.4"
189 | meta:
190 | dependency: transitive
191 | description:
192 | name: meta
193 | url: "https://pub.dartlang.org"
194 | source: hosted
195 | version: "1.7.0"
196 | nested:
197 | dependency: transitive
198 | description:
199 | name: nested
200 | url: "https://pub.dartlang.org"
201 | source: hosted
202 | version: "1.0.0"
203 | octo_image:
204 | dependency: transitive
205 | description:
206 | name: octo_image
207 | url: "https://pub.dartlang.org"
208 | source: hosted
209 | version: "1.0.2"
210 | page_transition:
211 | dependency: "direct main"
212 | description:
213 | name: page_transition
214 | url: "https://pub.dartlang.org"
215 | source: hosted
216 | version: "2.0.9"
217 | path:
218 | dependency: transitive
219 | description:
220 | name: path
221 | url: "https://pub.dartlang.org"
222 | source: hosted
223 | version: "1.8.1"
224 | path_provider:
225 | dependency: transitive
226 | description:
227 | name: path_provider
228 | url: "https://pub.dartlang.org"
229 | source: hosted
230 | version: "2.0.11"
231 | path_provider_android:
232 | dependency: transitive
233 | description:
234 | name: path_provider_android
235 | url: "https://pub.dartlang.org"
236 | source: hosted
237 | version: "2.0.16"
238 | path_provider_ios:
239 | dependency: transitive
240 | description:
241 | name: path_provider_ios
242 | url: "https://pub.dartlang.org"
243 | source: hosted
244 | version: "2.0.10"
245 | path_provider_linux:
246 | dependency: transitive
247 | description:
248 | name: path_provider_linux
249 | url: "https://pub.dartlang.org"
250 | source: hosted
251 | version: "2.1.7"
252 | path_provider_macos:
253 | dependency: transitive
254 | description:
255 | name: path_provider_macos
256 | url: "https://pub.dartlang.org"
257 | source: hosted
258 | version: "2.0.6"
259 | path_provider_platform_interface:
260 | dependency: transitive
261 | description:
262 | name: path_provider_platform_interface
263 | url: "https://pub.dartlang.org"
264 | source: hosted
265 | version: "2.0.4"
266 | path_provider_windows:
267 | dependency: transitive
268 | description:
269 | name: path_provider_windows
270 | url: "https://pub.dartlang.org"
271 | source: hosted
272 | version: "2.1.0"
273 | pedantic:
274 | dependency: transitive
275 | description:
276 | name: pedantic
277 | url: "https://pub.dartlang.org"
278 | source: hosted
279 | version: "1.11.1"
280 | platform:
281 | dependency: transitive
282 | description:
283 | name: platform
284 | url: "https://pub.dartlang.org"
285 | source: hosted
286 | version: "3.1.0"
287 | plugin_platform_interface:
288 | dependency: transitive
289 | description:
290 | name: plugin_platform_interface
291 | url: "https://pub.dartlang.org"
292 | source: hosted
293 | version: "2.1.2"
294 | process:
295 | dependency: transitive
296 | description:
297 | name: process
298 | url: "https://pub.dartlang.org"
299 | source: hosted
300 | version: "4.2.4"
301 | provider:
302 | dependency: "direct main"
303 | description:
304 | name: provider
305 | url: "https://pub.dartlang.org"
306 | source: hosted
307 | version: "6.0.3"
308 | rxdart:
309 | dependency: transitive
310 | description:
311 | name: rxdart
312 | url: "https://pub.dartlang.org"
313 | source: hosted
314 | version: "0.27.5"
315 | shimmer:
316 | dependency: transitive
317 | description:
318 | name: shimmer
319 | url: "https://pub.dartlang.org"
320 | source: hosted
321 | version: "2.0.0"
322 | sky_engine:
323 | dependency: transitive
324 | description: flutter
325 | source: sdk
326 | version: "0.0.99"
327 | source_span:
328 | dependency: transitive
329 | description:
330 | name: source_span
331 | url: "https://pub.dartlang.org"
332 | source: hosted
333 | version: "1.8.2"
334 | sqflite:
335 | dependency: transitive
336 | description:
337 | name: sqflite
338 | url: "https://pub.dartlang.org"
339 | source: hosted
340 | version: "2.0.3"
341 | sqflite_common:
342 | dependency: transitive
343 | description:
344 | name: sqflite_common
345 | url: "https://pub.dartlang.org"
346 | source: hosted
347 | version: "2.2.1+1"
348 | stack_trace:
349 | dependency: transitive
350 | description:
351 | name: stack_trace
352 | url: "https://pub.dartlang.org"
353 | source: hosted
354 | version: "1.10.0"
355 | stream_channel:
356 | dependency: transitive
357 | description:
358 | name: stream_channel
359 | url: "https://pub.dartlang.org"
360 | source: hosted
361 | version: "2.1.0"
362 | string_scanner:
363 | dependency: transitive
364 | description:
365 | name: string_scanner
366 | url: "https://pub.dartlang.org"
367 | source: hosted
368 | version: "1.1.0"
369 | synchronized:
370 | dependency: transitive
371 | description:
372 | name: synchronized
373 | url: "https://pub.dartlang.org"
374 | source: hosted
375 | version: "3.0.0+2"
376 | term_glyph:
377 | dependency: transitive
378 | description:
379 | name: term_glyph
380 | url: "https://pub.dartlang.org"
381 | source: hosted
382 | version: "1.2.0"
383 | test_api:
384 | dependency: transitive
385 | description:
386 | name: test_api
387 | url: "https://pub.dartlang.org"
388 | source: hosted
389 | version: "0.4.9"
390 | typed_data:
391 | dependency: transitive
392 | description:
393 | name: typed_data
394 | url: "https://pub.dartlang.org"
395 | source: hosted
396 | version: "1.3.1"
397 | uuid:
398 | dependency: transitive
399 | description:
400 | name: uuid
401 | url: "https://pub.dartlang.org"
402 | source: hosted
403 | version: "3.0.6"
404 | vector_math:
405 | dependency: transitive
406 | description:
407 | name: vector_math
408 | url: "https://pub.dartlang.org"
409 | source: hosted
410 | version: "2.1.2"
411 | win32:
412 | dependency: transitive
413 | description:
414 | name: win32
415 | url: "https://pub.dartlang.org"
416 | source: hosted
417 | version: "2.7.0"
418 | xdg_directories:
419 | dependency: transitive
420 | description:
421 | name: xdg_directories
422 | url: "https://pub.dartlang.org"
423 | source: hosted
424 | version: "0.2.0+1"
425 | sdks:
426 | dart: ">=2.17.5 <3.0.0"
427 | flutter: ">=3.0.0"
428 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
16 | /* End PBXBuildFile section */
17 |
18 | /* Begin PBXCopyFilesBuildPhase section */
19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
20 | isa = PBXCopyFilesBuildPhase;
21 | buildActionMask = 2147483647;
22 | dstPath = "";
23 | dstSubfolderSpec = 10;
24 | files = (
25 | );
26 | name = "Embed Frameworks";
27 | runOnlyForDeploymentPostprocessing = 0;
28 | };
29 | /* End PBXCopyFilesBuildPhase section */
30 |
31 | /* Begin PBXFileReference section */
32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
45 | /* End PBXFileReference section */
46 |
47 | /* Begin PBXFrameworksBuildPhase section */
48 | 97C146EB1CF9000F007C117D /* Frameworks */ = {
49 | isa = PBXFrameworksBuildPhase;
50 | buildActionMask = 2147483647;
51 | files = (
52 | );
53 | runOnlyForDeploymentPostprocessing = 0;
54 | };
55 | /* End PBXFrameworksBuildPhase section */
56 |
57 | /* Begin PBXGroup section */
58 | 9740EEB11CF90186004384FC /* Flutter */ = {
59 | isa = PBXGroup;
60 | children = (
61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */,
63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */,
65 | );
66 | name = Flutter;
67 | sourceTree = "";
68 | };
69 | 97C146E51CF9000F007C117D = {
70 | isa = PBXGroup;
71 | children = (
72 | 9740EEB11CF90186004384FC /* Flutter */,
73 | 97C146F01CF9000F007C117D /* Runner */,
74 | 97C146EF1CF9000F007C117D /* Products */,
75 | );
76 | sourceTree = "";
77 | };
78 | 97C146EF1CF9000F007C117D /* Products */ = {
79 | isa = PBXGroup;
80 | children = (
81 | 97C146EE1CF9000F007C117D /* Runner.app */,
82 | );
83 | name = Products;
84 | sourceTree = "";
85 | };
86 | 97C146F01CF9000F007C117D /* Runner */ = {
87 | isa = PBXGroup;
88 | children = (
89 | 97C146FA1CF9000F007C117D /* Main.storyboard */,
90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */,
91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
92 | 97C147021CF9000F007C117D /* Info.plist */,
93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
97 | );
98 | path = Runner;
99 | sourceTree = "";
100 | };
101 | /* End PBXGroup section */
102 |
103 | /* Begin PBXNativeTarget section */
104 | 97C146ED1CF9000F007C117D /* Runner */ = {
105 | isa = PBXNativeTarget;
106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
107 | buildPhases = (
108 | 9740EEB61CF901F6004384FC /* Run Script */,
109 | 97C146EA1CF9000F007C117D /* Sources */,
110 | 97C146EB1CF9000F007C117D /* Frameworks */,
111 | 97C146EC1CF9000F007C117D /* Resources */,
112 | 9705A1C41CF9048500538489 /* Embed Frameworks */,
113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
114 | );
115 | buildRules = (
116 | );
117 | dependencies = (
118 | );
119 | name = Runner;
120 | productName = Runner;
121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
122 | productType = "com.apple.product-type.application";
123 | };
124 | /* End PBXNativeTarget section */
125 |
126 | /* Begin PBXProject section */
127 | 97C146E61CF9000F007C117D /* Project object */ = {
128 | isa = PBXProject;
129 | attributes = {
130 | LastUpgradeCheck = 1300;
131 | ORGANIZATIONNAME = "";
132 | TargetAttributes = {
133 | 97C146ED1CF9000F007C117D = {
134 | CreatedOnToolsVersion = 7.3.1;
135 | LastSwiftMigration = 1100;
136 | };
137 | };
138 | };
139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
140 | compatibilityVersion = "Xcode 9.3";
141 | developmentRegion = en;
142 | hasScannedForEncodings = 0;
143 | knownRegions = (
144 | en,
145 | Base,
146 | );
147 | mainGroup = 97C146E51CF9000F007C117D;
148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
149 | projectDirPath = "";
150 | projectRoot = "";
151 | targets = (
152 | 97C146ED1CF9000F007C117D /* Runner */,
153 | );
154 | };
155 | /* End PBXProject section */
156 |
157 | /* Begin PBXResourcesBuildPhase section */
158 | 97C146EC1CF9000F007C117D /* Resources */ = {
159 | isa = PBXResourcesBuildPhase;
160 | buildActionMask = 2147483647;
161 | files = (
162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
166 | );
167 | runOnlyForDeploymentPostprocessing = 0;
168 | };
169 | /* End PBXResourcesBuildPhase section */
170 |
171 | /* Begin PBXShellScriptBuildPhase section */
172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
173 | isa = PBXShellScriptBuildPhase;
174 | buildActionMask = 2147483647;
175 | files = (
176 | );
177 | inputPaths = (
178 | );
179 | name = "Thin Binary";
180 | outputPaths = (
181 | );
182 | runOnlyForDeploymentPostprocessing = 0;
183 | shellPath = /bin/sh;
184 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
185 | };
186 | 9740EEB61CF901F6004384FC /* Run Script */ = {
187 | isa = PBXShellScriptBuildPhase;
188 | buildActionMask = 2147483647;
189 | files = (
190 | );
191 | inputPaths = (
192 | );
193 | name = "Run Script";
194 | outputPaths = (
195 | );
196 | runOnlyForDeploymentPostprocessing = 0;
197 | shellPath = /bin/sh;
198 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
199 | };
200 | /* End PBXShellScriptBuildPhase section */
201 |
202 | /* Begin PBXSourcesBuildPhase section */
203 | 97C146EA1CF9000F007C117D /* Sources */ = {
204 | isa = PBXSourcesBuildPhase;
205 | buildActionMask = 2147483647;
206 | files = (
207 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
208 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
209 | );
210 | runOnlyForDeploymentPostprocessing = 0;
211 | };
212 | /* End PBXSourcesBuildPhase section */
213 |
214 | /* Begin PBXVariantGroup section */
215 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
216 | isa = PBXVariantGroup;
217 | children = (
218 | 97C146FB1CF9000F007C117D /* Base */,
219 | );
220 | name = Main.storyboard;
221 | sourceTree = "";
222 | };
223 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
224 | isa = PBXVariantGroup;
225 | children = (
226 | 97C147001CF9000F007C117D /* Base */,
227 | );
228 | name = LaunchScreen.storyboard;
229 | sourceTree = "";
230 | };
231 | /* End PBXVariantGroup section */
232 |
233 | /* Begin XCBuildConfiguration section */
234 | 249021D3217E4FDB00AE95B9 /* Profile */ = {
235 | isa = XCBuildConfiguration;
236 | buildSettings = {
237 | ALWAYS_SEARCH_USER_PATHS = NO;
238 | CLANG_ANALYZER_NONNULL = YES;
239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
240 | CLANG_CXX_LIBRARY = "libc++";
241 | CLANG_ENABLE_MODULES = YES;
242 | CLANG_ENABLE_OBJC_ARC = YES;
243 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
244 | CLANG_WARN_BOOL_CONVERSION = YES;
245 | CLANG_WARN_COMMA = YES;
246 | CLANG_WARN_CONSTANT_CONVERSION = YES;
247 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
249 | CLANG_WARN_EMPTY_BODY = YES;
250 | CLANG_WARN_ENUM_CONVERSION = YES;
251 | CLANG_WARN_INFINITE_RECURSION = YES;
252 | CLANG_WARN_INT_CONVERSION = YES;
253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
254 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
255 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
258 | CLANG_WARN_STRICT_PROTOTYPES = YES;
259 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
260 | CLANG_WARN_UNREACHABLE_CODE = YES;
261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
263 | COPY_PHASE_STRIP = NO;
264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
265 | ENABLE_NS_ASSERTIONS = NO;
266 | ENABLE_STRICT_OBJC_MSGSEND = YES;
267 | GCC_C_LANGUAGE_STANDARD = gnu99;
268 | GCC_NO_COMMON_BLOCKS = YES;
269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
271 | GCC_WARN_UNDECLARED_SELECTOR = YES;
272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
273 | GCC_WARN_UNUSED_FUNCTION = YES;
274 | GCC_WARN_UNUSED_VARIABLE = YES;
275 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
276 | MTL_ENABLE_DEBUG_INFO = NO;
277 | SDKROOT = iphoneos;
278 | SUPPORTED_PLATFORMS = iphoneos;
279 | TARGETED_DEVICE_FAMILY = "1,2";
280 | VALIDATE_PRODUCT = YES;
281 | };
282 | name = Profile;
283 | };
284 | 249021D4217E4FDB00AE95B9 /* Profile */ = {
285 | isa = XCBuildConfiguration;
286 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
287 | buildSettings = {
288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
289 | CLANG_ENABLE_MODULES = YES;
290 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
291 | ENABLE_BITCODE = NO;
292 | INFOPLIST_FILE = Runner/Info.plist;
293 | LD_RUNPATH_SEARCH_PATHS = (
294 | "$(inherited)",
295 | "@executable_path/Frameworks",
296 | );
297 | PRODUCT_BUNDLE_IDENTIFIER = com.example.storeApiFlutterCourse;
298 | PRODUCT_NAME = "$(TARGET_NAME)";
299 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
300 | SWIFT_VERSION = 5.0;
301 | VERSIONING_SYSTEM = "apple-generic";
302 | };
303 | name = Profile;
304 | };
305 | 97C147031CF9000F007C117D /* Debug */ = {
306 | isa = XCBuildConfiguration;
307 | buildSettings = {
308 | ALWAYS_SEARCH_USER_PATHS = NO;
309 | CLANG_ANALYZER_NONNULL = YES;
310 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
311 | CLANG_CXX_LIBRARY = "libc++";
312 | CLANG_ENABLE_MODULES = YES;
313 | CLANG_ENABLE_OBJC_ARC = YES;
314 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
315 | CLANG_WARN_BOOL_CONVERSION = YES;
316 | CLANG_WARN_COMMA = YES;
317 | CLANG_WARN_CONSTANT_CONVERSION = YES;
318 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
319 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
320 | CLANG_WARN_EMPTY_BODY = YES;
321 | CLANG_WARN_ENUM_CONVERSION = YES;
322 | CLANG_WARN_INFINITE_RECURSION = YES;
323 | CLANG_WARN_INT_CONVERSION = YES;
324 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
325 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
326 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
327 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
328 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
329 | CLANG_WARN_STRICT_PROTOTYPES = YES;
330 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
331 | CLANG_WARN_UNREACHABLE_CODE = YES;
332 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
333 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
334 | COPY_PHASE_STRIP = NO;
335 | DEBUG_INFORMATION_FORMAT = dwarf;
336 | ENABLE_STRICT_OBJC_MSGSEND = YES;
337 | ENABLE_TESTABILITY = YES;
338 | GCC_C_LANGUAGE_STANDARD = gnu99;
339 | GCC_DYNAMIC_NO_PIC = NO;
340 | GCC_NO_COMMON_BLOCKS = YES;
341 | GCC_OPTIMIZATION_LEVEL = 0;
342 | GCC_PREPROCESSOR_DEFINITIONS = (
343 | "DEBUG=1",
344 | "$(inherited)",
345 | );
346 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
347 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
348 | GCC_WARN_UNDECLARED_SELECTOR = YES;
349 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
350 | GCC_WARN_UNUSED_FUNCTION = YES;
351 | GCC_WARN_UNUSED_VARIABLE = YES;
352 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
353 | MTL_ENABLE_DEBUG_INFO = YES;
354 | ONLY_ACTIVE_ARCH = YES;
355 | SDKROOT = iphoneos;
356 | TARGETED_DEVICE_FAMILY = "1,2";
357 | };
358 | name = Debug;
359 | };
360 | 97C147041CF9000F007C117D /* Release */ = {
361 | isa = XCBuildConfiguration;
362 | buildSettings = {
363 | ALWAYS_SEARCH_USER_PATHS = NO;
364 | CLANG_ANALYZER_NONNULL = YES;
365 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
366 | CLANG_CXX_LIBRARY = "libc++";
367 | CLANG_ENABLE_MODULES = YES;
368 | CLANG_ENABLE_OBJC_ARC = YES;
369 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
370 | CLANG_WARN_BOOL_CONVERSION = YES;
371 | CLANG_WARN_COMMA = YES;
372 | CLANG_WARN_CONSTANT_CONVERSION = YES;
373 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
374 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
375 | CLANG_WARN_EMPTY_BODY = YES;
376 | CLANG_WARN_ENUM_CONVERSION = YES;
377 | CLANG_WARN_INFINITE_RECURSION = YES;
378 | CLANG_WARN_INT_CONVERSION = YES;
379 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
380 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
381 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
382 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
383 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
384 | CLANG_WARN_STRICT_PROTOTYPES = YES;
385 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
386 | CLANG_WARN_UNREACHABLE_CODE = YES;
387 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
388 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
389 | COPY_PHASE_STRIP = NO;
390 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
391 | ENABLE_NS_ASSERTIONS = NO;
392 | ENABLE_STRICT_OBJC_MSGSEND = YES;
393 | GCC_C_LANGUAGE_STANDARD = gnu99;
394 | GCC_NO_COMMON_BLOCKS = YES;
395 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
396 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
397 | GCC_WARN_UNDECLARED_SELECTOR = YES;
398 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
399 | GCC_WARN_UNUSED_FUNCTION = YES;
400 | GCC_WARN_UNUSED_VARIABLE = YES;
401 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
402 | MTL_ENABLE_DEBUG_INFO = NO;
403 | SDKROOT = iphoneos;
404 | SUPPORTED_PLATFORMS = iphoneos;
405 | SWIFT_COMPILATION_MODE = wholemodule;
406 | SWIFT_OPTIMIZATION_LEVEL = "-O";
407 | TARGETED_DEVICE_FAMILY = "1,2";
408 | VALIDATE_PRODUCT = YES;
409 | };
410 | name = Release;
411 | };
412 | 97C147061CF9000F007C117D /* Debug */ = {
413 | isa = XCBuildConfiguration;
414 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
415 | buildSettings = {
416 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
417 | CLANG_ENABLE_MODULES = YES;
418 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
419 | ENABLE_BITCODE = NO;
420 | INFOPLIST_FILE = Runner/Info.plist;
421 | LD_RUNPATH_SEARCH_PATHS = (
422 | "$(inherited)",
423 | "@executable_path/Frameworks",
424 | );
425 | PRODUCT_BUNDLE_IDENTIFIER = com.example.storeApiFlutterCourse;
426 | PRODUCT_NAME = "$(TARGET_NAME)";
427 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
428 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
429 | SWIFT_VERSION = 5.0;
430 | VERSIONING_SYSTEM = "apple-generic";
431 | };
432 | name = Debug;
433 | };
434 | 97C147071CF9000F007C117D /* Release */ = {
435 | isa = XCBuildConfiguration;
436 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
437 | buildSettings = {
438 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
439 | CLANG_ENABLE_MODULES = YES;
440 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
441 | ENABLE_BITCODE = NO;
442 | INFOPLIST_FILE = Runner/Info.plist;
443 | LD_RUNPATH_SEARCH_PATHS = (
444 | "$(inherited)",
445 | "@executable_path/Frameworks",
446 | );
447 | PRODUCT_BUNDLE_IDENTIFIER = com.example.storeApiFlutterCourse;
448 | PRODUCT_NAME = "$(TARGET_NAME)";
449 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
450 | SWIFT_VERSION = 5.0;
451 | VERSIONING_SYSTEM = "apple-generic";
452 | };
453 | name = Release;
454 | };
455 | /* End XCBuildConfiguration section */
456 |
457 | /* Begin XCConfigurationList section */
458 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
459 | isa = XCConfigurationList;
460 | buildConfigurations = (
461 | 97C147031CF9000F007C117D /* Debug */,
462 | 97C147041CF9000F007C117D /* Release */,
463 | 249021D3217E4FDB00AE95B9 /* Profile */,
464 | );
465 | defaultConfigurationIsVisible = 0;
466 | defaultConfigurationName = Release;
467 | };
468 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
469 | isa = XCConfigurationList;
470 | buildConfigurations = (
471 | 97C147061CF9000F007C117D /* Debug */,
472 | 97C147071CF9000F007C117D /* Release */,
473 | 249021D4217E4FDB00AE95B9 /* Profile */,
474 | );
475 | defaultConfigurationIsVisible = 0;
476 | defaultConfigurationName = Release;
477 | };
478 | /* End XCConfigurationList section */
479 | };
480 | rootObject = 97C146E61CF9000F007C117D /* Project object */;
481 | }
482 |
--------------------------------------------------------------------------------